腾讯面试:MySQL事务与MVCC如何实现的隔离级别?( 二 )
- 原子性(atomicity): 事务的最小工作单元 , 要么全成功 , 要么全失败 。
- 一致性(consistency): 事务开始和结束后 , 数据库的完整性不会被破坏 。
- 隔离性(isolation): 不同事务之间互不影响 , 四种隔离级别为RU(读未提交)、RC(读已提交)、RR(可重复读)、SERIALIZABLE (串行化) 。
- 持久性(durability): 事务提交后 , 对数据的修改是永久性的 , 即使系统故障也不会丢失 。
读已提交(Read Committed/RC)又称为不可重复读 , 一个事务因为读取到另一个事务已提交的修改数据 , 导致在当前事务的不同时间读取同一条数据获取的结果不一致 。
举个例子 , 在下面的例子中就会发现SessionA在一个事务期间两次查询的数据不一样 。 原因就是在于当前隔离级别为 RC , SessionA的事务可以读取到SessionB提交的最新数据 。
发生时间 SessionA SessionB 1 begin; 2 select * from user where id=1;(张三) 3 update user set name='李四' where id=1;(默认隐式提交事务) 4 select * from user where id=1;(李四) 5 update user set name='王二' where id=1;(默认隐式提交事务) 6 select * from user where id=1;(王二)
可重复读(Repeatable Read/RR)又称为幻读 , 一个事物读可以读取到其他事务提交的数据 , 但是在RR隔离级别下 , 当前读取此条数据只可读取一次 , 在当前事务中 , 不论读取多少次 , 数据任然是第一次读取的值 , 不会因为在第一次读取之后 , 其他事务再修改提交此数据而产生改变 。 因此也成为幻读 , 因为读出来的数据并不一定就是最新的数据 。
举个例子:在SessionA中第一次读取数据时 , 后续其他事务修改提交数据 , 不会再影响到SessionA读取的数据值 。 此为可重复读 。
发生时间 SessionA SessionB 1 begin; 2 select * from user where id=1;(张三) 3 update user set name='李四' where id=1; (默认隐式提交事务) 4 select * from user where id=1;(张三) 5 update user set name='王二' where id=1;(默认隐式提交事务) 6 select * from user where id=1;(张三)
串行化(Serializable)所有的数据库的读或者写操作都为串行执行 , 当前隔离级别下只支持单个请求同时执行 , 所有的操作都需要队列执行 。 所以种隔离级别下所有的数据是最稳定的 , 但是性能也是最差的 。 数据库的锁实现就是这种隔离级别的更小粒度版本 。
发生时间 SessionA SessionB 1 begin; 2 begin; 3 update user set name='李四' where id=1; 4 select * from user where id=1;(等待、wait) 5 commit; 6 select * from user where id=1;(李四)
事务和MVCC原理不同事务同时操作同一条数据产生的问题示例:
发生时间 SessionA SessionB 1 begin; 2 begin; 3 查询余额 = 1000元 4 查询余额 = 1000元 5 存入金额 100元 , 修改余额为 1100元 6 取出现金100元 , 此时修改余额为900元 8 提交事务(余额=1100) 9 提交事务(余额=900)
发生时间 SessionA SessionB 1 begin; 2 begin; 3 查询余额 = 1000元 4 查询余额 = 1000元 5 存入金额 100元 , 修改余额为 1100元 6 取出现金100元 , 此时修改余额为900元 8 提交事务(余额=1100) 9 撤销事务(余额恢复为1000元)
上面的两种情况就是对于一条数据 , 多个事务同时操作可能会产生的问题 , 会出现某个事务的操作被覆盖而导致数据丢失 。
LBCC 解决数据丢失LBCC , 基于锁的并发控制 , Lock Based Concurrency Control 。
使用锁的机制 , 在当前事务需要对数据修改时 , 将当前事务加上锁 , 同一个时间只允许一条事务修改当前数据 , 其他事务必须等待锁释放之后才可以操作 。
推荐阅读
- 腾讯游戏发起对华为的挑战,或因后者对国内手机市场的影响力大跌
- 飞书文档微信小程序审核被卡?字节跳动副总裁谢欣:希望腾讯停止无理由封杀
- “科技+文化创意”加速文旅融合,腾讯文旅助力河南打造行业新名片
- 腾讯申请「打工鹅」商标,网友:“虾仁猪心”
- 腾讯苏州战略合作再升级,腾讯(苏州)数字产业基地揭牌
- 战火再起!字节跳动副总裁炮轰腾讯“无理封杀”
- 腾讯|以松江为起点和支点,腾讯“牵手”长三角G60科创走廊,开启合作新“朋友圈”
- 省人社厅与腾讯签署协议共同培养高素质“广东技工”
- 字节跳动高管喊话腾讯,称“飞书文档”小程序审核被卡近两月
- 疫情让线下教培机构停摆?别怕,腾讯教育“抗疫空投包”抵达
