Java事务编程中,弱隔离级别已提交读的实现原理是什么?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1824个文字,预计阅读时间需要8分钟。
若两个事务涉及相同数据且不存在依赖关系,它们可以安全并行执行。仅有当:某事务读取由另一事务同时修改的数据时,或两个事务同时修改同一数据时,才可能发生并发问题。
若两个事务不触及相同数据,即无数据依赖关系,则它们能安全并行运行。只有当:
- 某事务读取由另一个事务同时修改的数据时
- 或两个事务同时修改相同数据
才会出现并发问题。
并发 BUG 很难通过测试找到,因为这样的错误只有在特殊时序下才会触发。这样的时序问题可能非常少发生,通常很难重现 [1]。并发性也很难推理,特别是在大型应用中,你不一定知道哪些其他代码正在访问DB。只有一个用户访问数据时,应用开发就够麻烦了,多用户并发更困难,每个数据都可能被多个用户修改。
因此,DB一直试图通过来隐藏内部的各种并发问题。理论上,隔离是假装没有并发发生,让程序员生活不再加班。而可串行化隔离级别就是DB保证事务最终效果如同串行执行。但可串行化会有极大性能损失,许多DB不愿意牺牲性能,所以倾向较弱隔离级别,防止某些而非全部并发问题。
弱隔离导致的并发性错误不仅是理论问题,它们已造成很多资损,审计调查和客户数据破坏。比起盲目依赖工具,不如对各种并发问题及如何防止有深入理解,构建可靠、正确的应用。
本文共计1824个文字,预计阅读时间需要8分钟。
若两个事务涉及相同数据且不存在依赖关系,它们可以安全并行执行。仅有当:某事务读取由另一事务同时修改的数据时,或两个事务同时修改同一数据时,才可能发生并发问题。
若两个事务不触及相同数据,即无数据依赖关系,则它们能安全并行运行。只有当:
- 某事务读取由另一个事务同时修改的数据时
- 或两个事务同时修改相同数据
才会出现并发问题。
并发 BUG 很难通过测试找到,因为这样的错误只有在特殊时序下才会触发。这样的时序问题可能非常少发生,通常很难重现 [1]。并发性也很难推理,特别是在大型应用中,你不一定知道哪些其他代码正在访问DB。只有一个用户访问数据时,应用开发就够麻烦了,多用户并发更困难,每个数据都可能被多个用户修改。
因此,DB一直试图通过来隐藏内部的各种并发问题。理论上,隔离是假装没有并发发生,让程序员生活不再加班。而可串行化隔离级别就是DB保证事务最终效果如同串行执行。但可串行化会有极大性能损失,许多DB不愿意牺牲性能,所以倾向较弱隔离级别,防止某些而非全部并发问题。
弱隔离导致的并发性错误不仅是理论问题,它们已造成很多资损,审计调查和客户数据破坏。比起盲目依赖工具,不如对各种并发问题及如何防止有深入理解,构建可靠、正确的应用。

