暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL事务与事务隔离级别

长夜难眠 2020-07-16
163

点击蓝字

关注不迷途


背景


使用InnoDB存储引擎,使用行锁的时候其实涉及到事务,而事务又与事务隔离级别有关。


分析


那什么是事务?什么又是事务隔离级别呢?


事务是行锁并发的基本控制单位,它具有ACID特性。


什么是ACID特性?


原子性:事务开始到结束是一个整体,要么成功,要么全部失败回退。保证事务是原子的。


一致性:事务之前和之后数据库都是一致性的,它从一种状态到另一种一致状态,不会破坏数据库的完整约束。


它描述的是另一个事务要么读取到这个事务的开始状态,要么是结束的状态,不会读取到事务中间的状态,这是强一致性,串行化级别才能够达到这种理想状态。


隔离性:事务之间是隔离的,一个事务不应该影响到另一个事务的操作。


持久性:事务一旦提交,其结果是永久的。


事务的隔离性其中又有不同的隔离级别。


事务的隔离级别分为读未提交、读提交、可重复读(InnoDB默认)、串行化。


事务会产生一系列的问题:脏读、不可重复读、幻读等,而事务隔离级别是为了解决这种问题而产生的。


脏读:指事务a会读取到事务b修改但没有提交的数据。


不可重复读:指事务a在不同时间内读取到的数据时,如果在这期间事务b提交了修改的数据,而事务a读取到修改后的数据,这就会导致了事务a两次读取到的数据是不一样的。


幻读:指事务a对某一范围数据进行修改时,如果事务b新增符合这一范围内的数据时,事务a是不会对新增的数据进行修改的,所以结果会与期望的结果不一样。


不同的事务隔离级别解决事务产生的不同问题。


串行化:会串行化事务,让事务排队执行,解决了以上所有的问题,但是执行效率降低。


可重复读:指事务内多次读取的数据是一致,不会受到别的事务影响,虽然解决了脏读和不可重复读的问题,但是对幻读是手足无措的。


读提交:指当前事务只读取别的事务修改而且提交的结果,不会读取到没有提交的事务结果,虽然解决了脏读问题,但随之而来的是不可重复读问题。


读未提交:指各个事务相互影响,每个事务都可以读取到别的事务修改但没有提交的结果,这会导致出现脏读等问题。


思考


不同的事务隔离级别解决不同的事务问题,虽然可以解决所有的问题,但是却对性能影响巨大。


所以在问题可接受的情况下,可以适当选择低的事务隔离级别,InnoDB默认使用可重复读隔离级别。



喜欢本篇内容顺便点个在看吧


文章转载自长夜难眠,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论