点击蓝字
关注不迷途

背景
使用InnoDB存储引擎,使用行锁的时候其实涉及到事务,而事务又与事务隔离级别有关。
分析
那什么是事务?什么又是事务隔离级别呢?
事务是行锁并发的基本控制单位,它具有ACID特性。
什么是ACID特性?
原子性:事务开始到结束是一个整体,要么成功,要么全部失败回退。保证事务是原子的。
一致性:事务之前和之后数据库都是一致性的,它从一种状态到另一种一致状态,不会破坏数据库的完整约束。
它描述的是另一个事务要么读取到这个事务的开始状态,要么是结束的状态,不会读取到事务中间的状态,这是强一致性,串行化级别才能够达到这种理想状态。
隔离性:事务之间是隔离的,一个事务不应该影响到另一个事务的操作。
持久性:事务一旦提交,其结果是永久的。
事务的隔离性其中又有不同的隔离级别。
事务的隔离级别分为读未提交、读提交、可重复读(InnoDB默认)、串行化。
事务会产生一系列的问题:脏读、不可重复读、幻读等,而事务隔离级别是为了解决这种问题而产生的。
脏读:指事务a会读取到事务b修改但没有提交的数据。
不可重复读:指事务a在不同时间内读取到的数据时,如果在这期间事务b提交了修改的数据,而事务a读取到修改后的数据,这就会导致了事务a两次读取到的数据是不一样的。
幻读:指事务a对某一范围数据进行修改时,如果事务b新增符合这一范围内的数据时,事务a是不会对新增的数据进行修改的,所以结果会与期望的结果不一样。
不同的事务隔离级别解决事务产生的不同问题。
串行化:会串行化事务,让事务排队执行,解决了以上所有的问题,但是执行效率降低。
可重复读:指事务内多次读取的数据是一致,不会受到别的事务影响,虽然解决了脏读和不可重复读的问题,但是对幻读是手足无措的。
读提交:指当前事务只读取别的事务修改而且提交的结果,不会读取到没有提交的事务结果,虽然解决了脏读问题,但随之而来的是不可重复读问题。
读未提交:指各个事务相互影响,每个事务都可以读取到别的事务修改但没有提交的结果,这会导致出现脏读等问题。
思考
不同的事务隔离级别解决不同的事务问题,虽然可以解决所有的问题,但是却对性能影响巨大。
所以在问题可接受的情况下,可以适当选择低的事务隔离级别,InnoDB默认使用可重复读隔离级别。

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