文章目录
- 4.3.1读未提交(read uncommitted)
- 4.3.2读已提交(read committed)
- 4.3.3可重复读(repeatable read)
- 4.3.4序列化读/串行化读(serializable)
1.事务概述
事务:是一个完整的业务逻辑单元,不可再分,和事务相关的语句只有DML语句(insert,update,delete)。
2.事务的四大特性
原子性(Atomicity)
整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)。一致性(Consistency)
在事务开始之前与结束之后,数据库都保持一致状态。隔离性(Isolation)
一个事务不会影响其他事务的运行。持久性(Durability)
在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并不会被回滚。
3.事务中常用操作
事务(Transaction)
:一批操作(一组DML)开启事务(Start Transaction)
回滚事务(rollback)
提交事务(commit)
SET AUTOCOMMIT:禁用或启用事务的自动提交模式
注意:rollback和commit之后事务自动结束。
自动提交的开启和关闭
- 自动提交模式用于决定新事务如何及何时启动。
- 启用自动提交模式:
- 如果自动提交模式被启用,则单条DML语句将缺省地开始一个新的事务。
- 如果该语句执行成功,事务将自动提交,并永久地保存该语句的执行结果。
- 如果语句执行失败,事务将自动回滚,并取消该语句的结果。
- 在自动提交模式下,仍可使用
START TRANSACTION
语句来显式地启动事务。这时自动提交会暂时关闭, 在这期间可以执行多条SQL语句和DML语句,直到这些语句被统一提交或回滚。
- 禁用自动提交模式:
- 如果禁用自动提交,事务可以跨越多条语句。
- 在这种情况下,事务可以用
COMMIT
和ROLLBACK
语句来显式地提交或回滚。
- 自动提交模式可以通过服务器变量``AUTOCOMMIT
来控制。
开启和关闭自动提交如下:
mysql> SET AUTOCOMMIT = OFF; mysql> SET AUTOCOMMIT = ON; 或 mysql> SET SESSION AUTOCOMMIT = OFF; mysql> SET SESSION AUTOCOMMIT = ON;
4.事务的隔离级别
4.1事务存在的常见问题
事务的常见问题:
脏读(Dirty Read):
对于两个事务T1,T2,T1可以读取到T2更新了但未提交的数据,此时如果T2进行回滚,那么T1读取的内容就是临时且无效的。
不可重复读:
对于两个事务T1,T2,T1读取了一条记录,然后该记录又被T2更新并且提交了,当T1再次读取该记录时,与第一次读取的数据不相同。
幻读:
对于两个事务T1,T2,T1读取了一个表的某字段,T2往该表中插入一行新数据(或者删除了一行数据)并提交,当T1再次读取该表时会多出一行新数据(或者少了一行数据)。
4.2查看和设置隔离级别
隔离级别分类:
- 全局级:对所有的会话有效
- 会话级:只对当前的会话有效
查看隔离级别
查看会话级当前的隔离级别:select @@session.transaction_isolation;
查看全局级当前的隔离级别:select @@global.transaction_isolation;
设置隔离级别
设置会话级当前的隔离级别:set session transaction isolation level 隔离级别;
设置全局级当前的隔离级别:set global transaction isolation level 隔离级别;
4.3四个隔离级别
4.3.1读未提交(read uncommitted)
允许一个事务可以看到其他事务未提交的修改。
存在问题: 脏读,不可重复读,幻读。
4.3.2读已提交(read committed)
允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。
存在问题: 不可重复读,幻读。
4.3.3可重复读(repeatable read)
确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改。
存在问题:幻读现象。
4.3.4序列化读/串行化读(serializable)
将一个事务与其他事务完全地隔离。