mysql隔离级别初识

mysql的事务隔离级别:不同的事务运行过程中事务彼此之间相互影响的程度,这是个人的理解

场景1:

张三给李四转账,若此时的隔离级别为read uncommitted(读未提交),即同时操作同一数据库的两个事务,可以读到对方未提交的数据。会导致称为“脏读”的情况

则可能出现这种情况:

张三:1000,李四:1000。后者找前者借钱

双方都开启了事务。

张三给李四转500(张三=张三-500。李四=李四+500)

张三告知李四去查账(此时张三没有提交事务)

由于是read uncommitted(读未提交),李四看到了张三事务未提交的数据(李四的账户变为了1500),认为钱已经借到,打了个欠条。

张三rollback,两人账上最后还是各1000。李四被骗。

因此,read uncommitted(读未提交)安全性不高,需要进行整治。

以上已经经过测试

 

select @@transaction_isolation;

或是

show variables like '%isolation%';

可以查看到当前的隔离级别

 

set transaction_isolation = 'REPEATABLE-READ';

可以修改当前隔离级别(其余的连接需要重启才能生效)

 

场景2:

修改事务隔离级别为:

set transaction_isolation = 'Read-committed';

此时张三如果不提交,李四看到的将始终都是1000元,只有张三提交后,李四才能在自己的事务中看到变化

但这样会导致出现一个问题,李四在一次事务执行过程中会看到同一对象两次不一样的数据。在一些业务(如报表的数据显示中)并不合理

需要在一次事务的全程看到的数据都是一样的,就需要将隔离级别设置为:Repeatable-Read

这样,只有在李四退出了事务之后再去查看账户,才能看到账户金额的变化

 

最高隔离等级:Serializable (可串行化)

就是一个锁,在一个事务对一张表执行操作时,其他的事务甚至无法查看该表,将一直等待前者释放该表的”访问“资源

最安全,但也最低效

mysql默认在Repeatable-Read,oracle默认在Read-committed

posted @ 2021-12-25 11:56  biingpo  阅读(33)  评论(0)    收藏  举报