概述
事务的隔离级别
数据库标准规范中定义了事务之间的隔离级别。
- 读未提交
- 读已提交
- 可重复读
- 串行化
#事务的隔离级别
事务的隔离级别定义的是 多个事务之间的数据共享问题,即不同事务在同时开启(并发)访问数据库时,事务与事务之间它们如何访问数据,在数据库中定义了四种隔离级别,来限制其它事务对数据的修改。
#读未提交
开启一个事务,并设置该事务的隔离级别为 读未提交,这就表示,允许 这个事务读取到另外一个事务还没有提交的数据[理解错了,不是允不允许的问题,是当前的这个事务会读到别的正在进行的事务还没有提交的数据,是会不会的问题,而不是允许的问题],那么如果另外一个事务突然回滚,那么对于这个事务来讲,这个事务就读取到了一个错误的数据,因为另外一个事务已经回滚了。就会造成脏读,即表示这个事务读取到了一个错误的数据。(这也就意味着,允许其它事务对数据作修改,即使在未提交的情况下,也能够被我这个事务读取到,那别人如果回滚了,那我这个事务岂不是读错了数据,完犊子了,数据弄错了,所以如果把事务设置为读未提交,就造成了脏读的问题)
#读已提交
为了解决脏读的问题,那么我把这个事务设置为读已提交。这也就意味着,我这个事务只能读取到其它事务已经提交的数据,那这个时候,表示我这个事务开启的时候允许另外一个事务对数据作修 改,但是如果另外一个事务还没有提交的话,那么我这个事务是不会读取到的。这样就避免了上一种情况,你回滚就回滚吧,我又不读取你没有提交的数据,管你怎么搞,只要你不提交,跟我一点关系都没有,但是如果你提交的话,那我这个事务是能够知道的。注意这个事务,我是允许另一个事务修改这条数据的 ,这样就会造成,我这个事务刚读完数据,你特么就把它改了(因为这个事务的隔离级别允许别的事务改呀) ,那么我这个事务第二次再去读取这个数据,这不就第二次跟第一次比,数据不一样,又完犊子了,这就造成了不可重复读的问题[之前理解的错了,这个隔离级别下,不存在允不允许的问题,只是说当前的这个事务仅仅能看到其它正在并发的事务已经提交的结果]
#可重复读
为了解决可重复读的问题,我这个事务设置为可重复读,这就跟前面有些不一样了,我这个事务读了这条数据,那么其它事务你就不能修改这条数据(数据库对这条数据加锁了 )[这句话说错了,其它事务仍然能够修改这条记录,只是当前的这个事务看不到这个修改,也就是当前的这个事务的查询结果仍旧是原来的结果],这样的话我这个事务再去读取,这样的话,第二次跟第一次比,数据就一致了。这样的确能解决不可重复读的问题,我这个事务不允许你修改我读取过的数据,但是,我没有禁止你插入数据呀,或者删除数据[理解错了,不存在禁止的问题] 。我本来读到一共读到了10条数据(读取到10条数据,这个结果不是数据库里面的数据,只是我统计的一个结果而已),结果你又插入了一条数据。我这个事务:咿?刚刚是不是读错了,怎么多了一条记录,我幻读了?这就造成了幻读
#串行化
为了解决幻读,把事务设置为可串行化,这就意味着,我这个事务开启了,那么就不允许别的事务对这个表玩任何修改,删除,插入的操作,只允许我一个人玩这张表,这样幻读就没有了[后面实验发现,一个事务使用的隔离级别是串行化,那么并发的其它事务查询是正常的,但是修改会被阻塞住]。这样就没得并发了,很安全,但效率就很低了。
操作命令:
事务操作演示时的命令:
查看事务是否为自动提交状态
SHOW VARIABLES LIKE 'autocommit';
关闭自动提交事务
SET autocommit=0; -- 仅对当前会话有效
开启事务
START TRANSACTION; -- 可省略
提交事务
commit;
回滚事务
rollback;
查看隔离级别
select @@tx_isolation;
设置隔离级别
set session|global transaction isolation level 隔离级别;
后面再去了解一下MVCC多版本并发控制的原理
最后
以上就是甜美洋葱为你收集整理的事务隔离级别通俗的解释的全部内容,希望文章能够帮你解决事务隔离级别通俗的解释所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复