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

浙公网安备 33010602011771号