数据库事务隔离级别

上一篇文章中提到 Spring 的事务隔离级别,想想顺便把数据库的事务隔离级别也记录一下吧。

多事务数据访问存在的问题们

  • 脏读:一个事务读取到另一个事务修改过但未提交的数据
  • 不可重复读:一个事务内部两次读取同一数据,读出来的结果不一致(中途被另一个事务修改并提交了)
  • 幻读:一个事务内部两次读取同一数据,读出来的数量不一致(中途另一个事务插入或删除了)

SQL标准的事务隔离级别

  • 读未提交(read uncommitted):一个事务还没提交时,它做的变更就能被别的事务看到。也就是说基本没做什么事务隔离方面的处理,直接写入了。(上述问题均存在)
  • 读已提交(read committed):一个事务提交之后,它做的变更才会被其他事务看到。(存在不可重复读和幻读问题)
  • 可重复读(repeatable read):一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。(存在幻读问题)
  • 串行化(serializable):通过加锁的方式使事务只能够串行执行,当上一个事务执行完成之后下一个事务才能开始。

Q: 常见数据库的默认隔离级别?
Mysql(InnoDB):可重复读
Oracle:读已提交
Sql server:读已提交

Q: 读已提交和可重复读之间的区别是什么?
A: 读已提交和可重复读之间的区别在于,一个事务执行的中途,另一个事务提交了它的事务,就可能导致当前事务执行过程中看到的数据存在不一致的现象。

Q:可重复读存在什么问题,使得必须使用串行化来解决?
A:存在幻读,Mysql通过快照读可以解决select的幻读问题,但是对于写操作还是使用的当前读,会所以并没有完全解决幻读的问题。执行写操作之后会修改这次写操作的版本为本次事务的版本。


数据库事务隔离级别
https://www.llimmy.top/2021/03/22/数据库事务隔离级别/
作者
Limmy
发布于
2021年3月22日
许可协议