MySQL事务
特性(ACID):
- 原子性(automicity):要不全部成功,要不全部失败
- 一致性(consistency)
- 隔离性(isolation)
- 持久性(durability)
自动提交
MySQL默认采用自动提交模式。在当前连接中可以通过设置AUTOCOMMIT来切换自动提交模式;
mysql> SET AUTOCOMMIT = 1;
1/ON:启用;0/OFF:禁用
在事务中混合使用存储引擎
MySQL服务层不管理事务,事务是由下层存储引擎实现的。在同一个事务中,混合使用多个存储引擎是不可靠的。如果同时使用了事务型引擎(如InnoDB)和非事务型引擎(MyISAM),在正常提交时虽然不会有什么问题,但是当需要回滚时,非事务型的表上的变更将无法撤销,这违背了事务的基本原则。
隐式和显式锁定
InnoDB采用的是两阶段锁定协议。在事务执行过程中,随时都可以锁定。只有在执行COMMIT或者ROOLLBACK时才会释放,并且所有的锁都是同一时刻被释放。InnoDB会根据隔离级别在需要的时候自动加锁。上述为隐式锁定。
InnoDB也支持通过特定的语句显式锁定。
隔离的级别
-
READ UNCOMMITED(未提交读)
-
READ COMMITED(提交读):解决了未提交读的脏读问题
-
REPEATABLE READ(可重复读):解决了提交读的不可重复读问题
MySQL默认的隔离级别
-
SERIALIZABLE(可串行化):解决了可重复读的幻读问题
- 什么是可串行化调度:在并发执行中,通过保证任何调度的效果都和没有并发执行的调度效果一致,可以确保数据库的一致性,在某种意义上等价于一个串行调度。这种调度称为可串行化调度。
// 设置事务隔离级别 mysql> set session transaction isolation level read commited;
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读 |
---|---|---|---|---|
READ UNCOMMITED | yes | yes | yes | no |
READ COMMITED | no | yes | yes | no |
REPEATABLE READ | no | no | yes | no |
SERIALIZABLE | no | no | no | yes |
事务的封锁协议
1. 两阶段封锁协议
两阶段封锁协议保证可串行化。该协议要求每个事务分两个阶段进行加锁和解锁。
- 增长阶段(growing phase):事务可以获得锁,但是不可以释放锁。
- 缩减阶段(shrinking phase):事务可以释放锁,但是不能获得新锁。
两阶段锁仍会有死锁。
2. 严格两阶段封锁协议
所有排它锁不允许在事务提交之前释放,可以避免级联回滚。
3. 强两阶段封锁协议
任何锁不得在事务提交之前释放
网友评论