事务
所谓事务是用户定义的一个数据库操作系列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。
事务冲突类型
1、有关脏读
脏读是最简单的一种冲突类型。
【定义】A事务访问并修改了数据,但未提交;B事务读取了A事务修改后的数据,发生了脏读。
【隐患】若A回滚,则B所做的一切操作都是错的。
【举例】对同一账户的存取款,A为取款事务,B为转账事务,操作时间片如表所示。
image
2、有关不可重复读
这个冲突很有意思。
【定义】A事务访问一条数据后,B事务修改了这条数据,A事务再次访问这条数据发现前后两次相同的读取操作结果不一致。
【讨论】在实际使用中,会有谁在一个事务中写前后两次去访问同一条数据这样的睿智的操作呢?在我看来,有一种说法是认可的。就是这种可重复读的属性保证的是在一个事务执行的过程中,所使用的查询过的数据都是不会改变的,否则它所做的所有操作都是错误的。但这和丢失更新不是一样了吗。也有人说,是用于主从同步的,这里我还没能理解。
同一个任务两次 select 本身就是多余的。mysql 默认 rr 主要是为了主从同步时,采用逻辑 sql 同步时的一致性,因为主库的 sql 是并发执行的,会有两个事务一起再跑,从库同步是单线程的,不会有两个事务同时在跑,如果不是 rr,出现楼主的栗子说的情况时,主从数据就不一致了
3、有关幻读
【定义】A事务读取了满足条件的所有行后,B事务插入了一行数据,当A事务再次读取同样条件的数据时,发现多出了一条数据。
【讨论】又会有哪两次去读同样条件的数据呢?实际上,第二次读都不是指真的读,“插入”操作也会先“读”一下是不是已经存在条目了。
【举例】正常A事务的目的是,查询一次是否存在条目,若不存在,则插入条目;干扰B事务的目的是,直接插入条目。
image
这就是幻读真实的例子,正常的事务在读取条目item后,发现不存在条目item,而在它插入的时候,却发现已经存在条目item,前后两次“读取”不一致,原因是事务B插入了一条item。这个事情造成的后果是,A事务的正常执行逻辑被干扰了。
作者:在北方玩弹子球
链接:https://www.jianshu.com/p/6ec612f75716