精通Java事务编程(7)-可串行化隔离级别之两阶段锁定

本文详细介绍了两阶段锁定(2PL)在数据库中的应用,特别是在Java事务编程中如何实现可串行化隔离级别。2PL通过锁机制防止并发操作引发的脏写,读写互斥,确保事务的串行化执行。它在MySQL的InnoDB、SQL Server和DB2的可重复读中得到实现。然而,2PL由于其锁的使用和并发性的降低,导致性能成为主要瓶颈,可能产生死锁并影响事务的吞吐量和响应时间。为了解决幻读问题,文章还提到了谓词锁和索引范围锁的概念,后者作为谓词锁的性能优化方案,在大型数据库中更常见。
摘要由CSDN通过智能技术生成

近30年,DB只有一种广泛使用的串行化算法:两阶段加锁

2PL不是2PC

请注意,虽然两阶段锁定(2PL)听起来非常类似于两阶段提交(2PC),但是完全不同概念

之前我们知道,加锁可防止脏写:即若两个事务同时尝试写入同一对象,则锁可确保第二个写必须等第一个写完成事务(中止或提交)才能继续。

两阶段锁定类似,但锁的强制性更高。只要没有写入,就允许多个事务同时读取同一个对象。但对象只要有写,就得加锁独占访问:

  • 若事务 A 已读某对象,此时B想写该对象,则必须等A提交或中止才能继续,这确保 B 不能在 A 执行过程的中间意外改变对象
  • 若事务 A 已写某对象,此时 B 想读该对象,则 B 必须等 A 提交或中止才能继续,像图-1读取旧版本的对象在 2PL 下不可接受

2PL不仅在并发写互斥,读写之间也互斥。快照级别隔离是读写不互斥,这是 2PL 和快照隔离的关键区别。且因 2PL 提供串行化,可防止前文讨论的所有竞争条件,包括丢失更新和写倾斜。

3.2.1 实现原理

2PL已在:

  • MySQL(InnoDB)和 SQL Server 实现可串行化
  • DB2 中的可重复读

读与写的阻塞是通过为数据库中每个对象添加锁来实现的。锁可处于 共享模式或独占模式,使用如下:

  • 若事务要读对象,则须先共享模式获取锁。允许多事务同时持有一个对象的共享锁。但若某事务已持有对象的独占锁,则其它事务必须等待
  • 若事务要写对象,须以独占模式获取锁
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值