数据库锁、隔离级别
概述
数据库锁可以分为:乐观锁和悲观锁。
乐观锁手段:
- 版本号
- 时间戳
- 待更新字段
- 所有字段
悲观锁
按性质分:
- 共享锁
- 排他锁
- 更新锁
按作用范围分:
- 行锁
- 表锁
事务有四大性质(ACID):1.原子性 2.一致性 3.隔离性 4.持久性
并发操作数据库可能出现的问题:1.第一类丢失更新 2.第二类丢失更新 3.脏读 4.不可重复读 5.幻读
数据库隔离级别:1. 读未提交 2. 读已提交 3. 可重复读 4. 串行化
事务四大性质
- 原子性
原子性是指事务里面包括的所有操作,要么全部成功,要么全部失败。 - 一致性
事务提交后,数据库会从一个状态转变成另一个一致性的状态。类似A给B转账,A减少100,则B增加100 - 隔离性
事务与事务之间相互是需要一定程度的隔离。不然得到的数据将不可靠。 - 持久性
数据库的数据后被保存到数据库所在的服务器的磁盘中。就算宕机了,重启后数据还是可以恢复的。
并发数据库下可能发生的问题
- 第一类丢失修改
事务A提早开启事务,事务B在A的中途进行,并对同一个字段进行了读取、修改、提交。但是事务A进行了回滚,则事务B的修改就丢失了。 - 第二类丢失修改
事务B先于事务A开始,事务A的读取动作比事务B慢一点,但是事务B的提交早于事务A。事务A后续提交后,会对事务B提交的结果进行覆盖。 - 脏读
脏读存在于事务B进行了修改,但是还未提交的情况下,事务A对未提交的字段进行读取,但是事务B此时进行了回滚操作,事务A再进行提交操作。这时的数据就产生了错误。 - 不可重复度
事务A会对同一个字段的值进行多次读取,事务B在中途进行提交,导致事务A第二次读取的值与第一次不一样。 - 幻读
此处的幻读强调的是多次读得到的行数与前几次读到的行数不一样。
事务隔离级别
Read Uncommitted (读未提交)
- 读事务:允许其他事务的读写
- 写事务:
未提交
的写事务禁止其他写事务,允许其他读事务 - 解决:第一类丢失更新
- 问题:脏读、不可重复读、幻读、第二类丢失更新(更新覆盖)
Read Committed (读已提交)
- 读事务:允许其他事务的读写
- 写事务:
未提交
的写事务禁止其他事务的读写 - 解决:脏读、第一类丢失更新
- 问题:不可重复度、幻读、第二类丢失更新
Repeatable Read(可重复读)
- 读事务:允许其他事务的读、禁止其他事务的写
- 写事务:
未提交
的写事务禁止其他事务的读写 - 解决:脏读、第一类丢失更新、第二类丢失更新、不可重复读
- 问题:幻读
- 解决方案:MVCC(多版本并发控制),一个事务开始,会得到相应的版本号,在这个事务里面读同一个版本号的同一个数据,都是相同的,解决了
不可重复读
。
Serializable(串行化)
每个事务串行执行,不存在并发的情况,效率极低。
解决:各种并发问题
问题:没有任何问题