事务并发带来的问题
- 丢失修改(lost update):事务 1 与事务 2 从数据库中读入同一数据并修改,事务 2 的提交结果破坏了事务 1 提交的结果, 导致事务 1 的修改被丢失。(W-W)
- 读 “脏” 数据(dirty read):事务 1 修改某一数据,并将其写回磁盘,事务 2 读取同一数据后,事务 1 由于某种原因被撤消,这时事务 1 已修改过的数据恢复原值,事务 2 读到的数据就与数据库中的数据不一致,是不正确的数据,又称为 “脏” 数据。(W-R)
- 不可重复读(non-repeatable read):事务 1 读取数据后,事务 2 执行更新操作,使事务 1 无法再现前一次读取结果。(R-W)
并发不一致性的解决办法(封锁协议)
一级封锁协议
事务 T 在修改数据 W 之前必须先对其加 X 锁,直到事务结束才释放(读不加锁)
一级封锁协议可防止 丢失修改
二级封锁协议
一级封锁协议基础上,事务 T 在读取数据 R 之前必须先对其加 S 锁,读完后即可释放 S 锁
**二级封锁协议可以防止 丢失修改 和 读 “脏” 数据 **
三级封锁协议
一级封锁协议基础上,事务 T 在读取数据 R 之前必须先对其加 S 锁,直到事务结束才释放
三级封锁协议可防止 丢失修改、读脏数据和不可重复读
并行事务正确性的唯一准则(可串行化调度)
可串行性的定义
几个事务的并行执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同。 这种并行调度策略称为可串行化(Serializable) 的调度
可串行性是并行事务正确性的唯一准则
什么是冲突操作
冲突操作是指读写操作和写写操作