定义
一组原子性的sql,要么都执行,要么都不执行。特性:ACID(原子性,一致性,隔离性,持久性)
隔离级别
- 未提交读。一个事物可以读取另一个事物中还没提交的数据(脏读)
- 提交读(又叫不可重复读)。一个事物开始时只能读取已提交的事物的修改(提交读的解释);事物t1开始时,读取行row1,执行事物过程中,A被其他事物t2修改,提交,事物t1再次读取row1,会导致前后读取的结果不一致(即不可重复读).
- 可重复读。MySQL默认的事物隔离级别。即一个事物中,无论某时读取的某数据都是一致的。可重复读可能会产生幻读。(InnoDB中通过MVCC已解决幻读)
- 可串行化。顾名思义,强制事物串行执行。无并发。所以没有脏读,幻读,不可重复读等现象。但是会导致大量的超时,和锁竞争。
幻读:重点在于 insert 和 读取范围记录。即某个事物读取一个范围的记录时,另一个事物在该范围内新增了一条记录。这个事物再次读取这个范围记录时,就会多一行。
| 隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读 |
|---|---|---|---|---|
| 未提交读 | Y | Y | Y | N |
| 提交读 | N | Y | Y | N |
| 可重复读 | N | N | Y | N |
| 未提交读 | N | N | N | Y |
死锁
事物1:
begin:
lock A
lock B
commit;
事物2:
begin:
lock B
lock A
commit;
多个事物以不同顺序锁定互相依赖的资源时,就有可能产生死锁。MySQL 会回滚其中一个已执行较少操作的事物。
事物日志
存储引擎在修改数据时,修改其内存拷贝,再以追加的方式持久化到磁盘上的事物日志中。因此是采用顺序IO。事物日志持久化后,在后台慢慢的将修改的数据写会磁盘。
参考 《高性能MySQL》