数据库事务隔离级别
上一篇文章中提到 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/数据库事务隔离级别/