一、 事务是一系列密切相关的数据库操作的组合,对系统的其他操作而言表现为一个整体。也就是,这一组操作要么全部成功,要么全部失败。事务的四大特性是ACID,也即原子性、一致性、隔离性和持久性。(相关英文定义,参见http://tech.it168.com/a2016/0905/2900/000002900122.shtml)
二、 严格的串行可以保证数据操作的正确性,但是在并发下回损害系统的吞吐能力(隔离的事务串行阻塞+大量的回滚)。为了平衡高效和安全之间的矛盾,牛人们提出了四种隔离级别,以处理不同场景下对异常结果不同接受程度。
-
Read Uncommitted: 可以读到尚未提交事务操作的数据
-
Read Committed(不可重复读): 只能看到已提交事务的操作结果
-
Repeatable Read: 同一个事务中读到的结果是相同的
-
Serializable: 强制串行执行
四种隔离级别可以避免的问题
脏读 | 不可重复读 | 幻读 | |
读未提交 | Y | Y | Y |
不可重复读 | N | Y | Y |
重复读 | N | N | Y |
串行化 | N | N | N |
三、 事务的原理
实现事务的的基本功能和ACID特性,技术核心是并发控制和日志技术。
-
并发控制:MVVC , 2PL, OCC: 保证并发下的正确执行
2PL的原理是我们的老朋友,锁机制。其他的两种则是通过对时刻版本的记录和回滚,保证并发正确性的。
-
日志: redo/undo WAL协议:保证异常情况下的恢复
四、 UML时序图
-
脏读场景描述:
-
脏读解决
-
不可重复读场景描述:
-
不可重复读解决
-
幻读场景描述:
-
幻读解决
参考资料:
http://tech.it168.com/a2016/0905/2900/000002900122.shtml
http://blog.csdn.net/xiaolinyouni/article/details/6997392
http://blog.csdn.net/sk199048/article/details/50596092
http://blog.csdn.net/tangkund3218/article/details/47704527