事务的四种隔离级别

事务的四种隔离级别

级别从低到高:
- read uncommitted
- read committed
- repeatable read
- seriaizable

在事务的并发操作中可能会出现脏读,不可重复读,幻读


read uncommitted

读未提交
一个事务可以读另一个事务未提交的数据

A 给 B 打钱要打500 打成了5000 发现错误进行回滚 再重新打500
B 在 A 回滚之前查询余额 会发现多了5000 但其实最后存进去的还是500
这就是脏读


read committed

可避免脏读

读提交后的数据 一个事务被提交后 才可以被另一个事务读

A 和 B 共用一个银行卡里的钱
A 在淘宝买东西要100 付款前系统检查卡里余额还有200 足够支付
B 在 A 付款之前 将卡里的钱转走150
A 确认付款时系统再次检查 发现卡里余额不足

这就是不可重复读


repeatable read

可避免脏读 不可重复读

开始读取事务时 不允许修改操作

还是上面那个例子
现在 A 付款时(事务开启时) 不允许update操作
A可以正常付款

但是会出现幻读(insert操作):
还是 A B 共用一张银行卡 A 想看看这星期一共花了多少钱
查询这星期所有账单 一共是800
然后打印出来(commit)
但是 B 在 A 打印之前支出了200
A 打印出来是1000 好像出现了幻觉一样


seriaizable

可避免脏读 不可重复读 幻读

事务串行化顺序执行
是最高的事务隔离级别
但是效率低 耗数据库性能 一般不用


大多数数据库默认的事务隔离级别是read committed(Sql Server Oracle)
MySQL的默认隔离级别是repeatable read

你可能感兴趣的:(事务的四种隔离级别)