事务隔离级别仅仅在并发的情况讨论,例子中的事务B多发生在事务A执行的过程中,请读者仔细判断
读未提交
有脏读(读取到其他事务未提交的数据)问题
例子:事务A修改修改余额为100,但是没有提交的时候事务B查询了,支付宝转账卡住了退出,再进来转账,看见余额少了,其实没有少,这就是脏读
读已提交
解决了脏读,有不可重复读(一个事务中两次读取到的数据不一样)
可重复读
Innodb默认事务隔离级别解决了不可重复读,有幻读(一个事务中有两次读取的数据不一样,针对的是集合数据,而非一条数据)
序列化读
解决了所有问题,但是效率低,粒度大
第一类更新丢失: ab执行事务,b回滚把a的数据也回滚了
第二类更新丢失: ab执行事务,a提交了b也提交了,但是b把a的数据覆盖了
MVCC多版本并发控制
读比写多,写的时候需要加锁,这就导致性能低下,需要无锁去读,于是就有了多版本,读写发生在不同的数据版本。
undolog日志:更新日志之前将原有的数据记录为历史版本,最新的数据记录为当前版本,于是产生当前读和快照(历史版本)读,不同版本通过隐藏字段roll point进行连接。
mysql一般通过事务ID进行具体的事务选择