🍋事务
- 事务:一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行(例如转账时)。如果某条sql语句一旦执行失败或者产生错误,整个单元将会回滚,所有收到影响数据将返回到事务开始之前的状态
- 事务的ACID属性
❤️原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
❤️一致性(Consistency):事务务必使数据库从一个一致性状态变换到另外一个一致性状态
❤️隔离性(Isolation):一个事物的执行不能被其他事物干扰,即一个事物内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰
❤️持久性(Durability):一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何的影响
🍉事物的创建
- 隐式事务:事务没有明显的开始和结束的标记,比如insert、update、delete语句
- 显式事务:事务具有明显的开启和结束的标记,但前提是,必须先设置自动提交功能为禁用(set autocommit=0;仅针对当前事务有效,下次再用到的时候要重新关闭)
#步骤一 开启事务
set autocommit = 0; #此时已经默认开启事务了
start transaction#可选
#步骤二 编写事务中的sql语句(insert update delete select)
#步骤三 结束事务
commit;# 提交事务 二选一
rollback;# 回滚事务 二选一
🍑数据库的隔离级别
- 对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题
- Mysql支持4种事务隔离级别,默认的事物隔离级别为:REPEATABLE READ
- READ UNCOMMITTED:读未提交的数据,允许事务读取未被其他事务提交的变更,脏读、不可重复读和幻读的问题都会出现
- READ COMMITTED:读已提交的数据,只允许事务读取已经被其他事务提交的变更,可以避免脏读,但是不可重复读和幻读问题仍然存在
- REPEATABLE READ:可重复读,确保事务可以多次从一个字段中读取相同的值,在这个事务的持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题仍然存在
- SERIALIZABLE:串行化,确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都能避免,但是性能十分低下
- 查看当前的隔离级别
select @@tx_isolation;
#8.0之后的使用
select @@transaction_isolation;
- 设置会话层面的隔离级别
set session transaction isolation level read committed;
*设置数据库系统的全局的隔离级别
set global transaction isolation level read uncommitted;
- 对数据库进行更新的时候可能会导致幻读的出现
🥑 事务的回滚
- 在事务中,执行delete from tab_stu;然后执行回滚操作,则不会发生数据的删除,而如果执行的是truncate table tab_stu;即使执行了回滚操作,表中的数据仍然会被清空。
- savepoint搭配rollback使用,回滚到指定点
set autocommit = 0;
start transaction;
delete from tab_stu where id =29;
savepoint a; #a是返回点的名称
delete from tab_stu where id =32;
rollback to a;
#最后的执行结构,id=29的行被删除,32的没有被删除