「学习笔记」MySQL事务处理与并发控制
1. MySQL事务
- 事务: 数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;事务是一组不可再分割的操作集合(工作逻辑单元);
- 事务的特性(ACID):
- 原子性(Atomicity,或称不可分割性):最小的工作单元,整个工作单元要么一起提交成功,要么全部失败回滚
- 一致性(Consistency):事务中操作的数据及状态改变是一致的,即写入资料的结果必须完全符合预设的规则, 不会因为出现系统意外等原因导致状态的不一致
- 隔离性(Isolation,又称独立性):一个事务所操作的数据在提交之前,对其他事务的可见性设定(一般设定为不可见)
- 持久性(Durability):事务所做的修改就会永久保存,不会因为系统意外导致数据的丢失
- 事务的开启与提交模式
- 若参数autocommit=0,自动开启手动提交
- 若参数autocommit=1(系统默认值),又分为两种状态:
- 自动开启自动提交:用户的每一个操作都是一个完整的事务周期。
- 手动开启手动提交:从用户执行
start transaction命令到用户执行commit命令之间的一系列操作为一个完整的事务周期。若不执行commit命令,系统则默认事务回滚。begin或者start transaction– 开启事务commit或者rollback– 事务提交或回滚
1.1 事务的隔离级别
- 查看/设置隔离级别
- 查看:
SELECT @@tx_isolation - 设置:
set tx_isolation='xxx'
- 查看:
- 读未提交(Read Uncommitted)
- 事务未提交对其他事务也是可见的,脏读(dirty read)
- 读提交(Read Committed)–解决脏读问题
- 一个事务开始之后,只能看到自己提交的事务所做的修改,不可重复读(nonrepeatable read)
- 可重复读(Repeatable Read)–解决不可重复读问题
- 在同一个事务中多次读取同样的数据结果是一样的,这种隔离级别未定义解决幻读的问题
- 串行化(Serializable)–解决所有问题
- 最高的隔离级别,通过强制事务的串行执行,但是会导致大量超时以及锁争用问题
Mysql默认采用
REPEATABLE_READ隔离级别,Oracle默认采用READ_COMMITTED隔离级别。 事务的隔离级别的实现:锁、MVCC(多版本并发控制 Multiversion Currency Control)。