10-1-2-2 事务的隔离机制


数据库多是并发执行的,因为隔离性的原因会带来一些问题

事务的四个隔离级别

序号 隔离级别 功能
1 read uncommitted 读取未提交的数据
2 read committed 读取已经提交的数据
3 repeatable read 重复读取
4 serializeable 序列化

业务案例1

10-1-2-2 事务的隔离机制

 

事务a和事务b都去买票,a买了未提交,之后b买了提交了

a事务就要执行回滚操作,这样对于a来说反复的购票失败是一个不好的体验,故需要它能读取到其他事务的临时数据

修改事务隔离级别

  • READ UNCOMMITTED 代表可以读取其他事务未提交的数据

    SET SESSION TRANSACTION ISOLATION LEVEL
    READ UNCOMMITTED;

     

START TRANSACTION;
UPDATE t_emp SET sal=1;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
SELECT empno,ename,sal FROM t_emp;
COMMIT;

业务案例2

10-1-2-2 事务的隔离机制

 

事务b转出100元,但未提交,此时事务a转入1000元,如果a可以读取b的临时数据,则此时账号内应该为4900再加1000元=5900元,此时去读账户,里面只有5900元,但此时b回滚操作后,账务内有6000元,对于前一个用户来说这是不合理的。

(但是上述情况再MySQL中好像实现不了)

修改事务隔离级别

  • READ COMMITTED 代表可以读取其他事务已经提交的数据

    SET SESSION TRANSACTION ISOLATION LEVEL
    READ COMMITTED;

     

START TRANSACTION;
UPDATE t_emp SET sal=1;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
SELECT empno,ename,sal FROM t_emp;
COMMIT;

业务案例3

事务a去买东西,再选中一个商品,准备付款的时候,事务b将商品涨价,此时事务a应该是不管怎么刷新当前页面都是适用原价购买,而不适用涨价后的价格购买

  • REPEATABLE READ 代表事务在执行中反复读取数据、得到的结果是一致的,不会受到其他事务的影响

SET SESSION TRANSACTION ISOLATION LEVEL
REPEATABLE READ;

这里需要注意的点,就是要执行SQL语句后,才会再redo日志中留下标记的数据,这样才可以重复读取数据

事务的序列化

  • 由于事务并发执行所带来的问题,前三种隔离级别只适用在某些业务场景中,但是序列化的隔离性,让事务逐一执行,就不会产生上述问题了

SET SESSION TRANSACITON ISOLATION LEVEL
SERIALIZABLE;

 

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/244739.html

(0)
上一篇 2022年4月17日 16:50
下一篇 2022年4月17日 16:50

相关推荐

发表回复

登录后才能评论