首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >悲观锁定与可序列化事务隔离级别

悲观锁定与可序列化事务隔离级别
EN

Stack Overflow用户
提问于 2017-11-22 17:50:19
回答 2查看 5.6K关注 0票数 19

我有点理解实体锁定和事务隔离级别的目的,但无法理解悲观锁定和可序列化级别之间的区别。据我所知,在这两种情况下,表都会被锁定,并且没有其他事务可以访问它,因此在这两种情况下,防止并发修改的操作都由DB执行,这看起来没有什么不同。有人能解释一下这里是否真的有区别吗?

EN

回答 2

Stack Overflow用户

发布于 2017-11-24 13:03:22

(我不认为你在使用ObjectDB。如果您编辑您的问题,并包含与JPA一起使用的特定数据库,您可能会得到更好的答案。)

我不喜欢乐观锁定和悲观锁定的术语。我认为乐观并发控制和悲观并发控制更准确。锁是处理并发控制问题的最常见方法,但它们不是唯一的方法。(日期数据库系统简介中关于并发的章节大约有25页。)

事务管理和并发控制的主题并不局限于数据的关系模型或SQL数据库管理系统(dbms)。事务隔离级别与SQL有关。

悲观的并发控制实际上只意味着当dbms开始处理请求时,dbms会阻止其他事务访问某个事务。行为取决于dbms供应商。不同的供应商可能会通过锁定整个数据库、锁定某些表、锁定某些页面或锁定一些行来阻止访问。或者dbms可能以不直接涉及锁的其他方式阻止访问。

事务隔离级别是SQL试图解决并发控制问题的方式。事务隔离级别在SQL标准中定义。

可序列化事务隔离级别确保并发、可序列化事务的效果与按特定顺序一次运行它们相同。保证描述了效果--而不是实现这种效果所需的任何特定类型的并发控制或锁定。

票数 10
EN

Stack Overflow用户

发布于 2017-11-24 16:10:26

悲观锁定通常涉及对数据库的写操作,以便以安全和独占的方式进行更改。这通常是通过执行select ... for update完成的。这将防止或延迟其他连接对数据库中锁定的记录执行自己的select ... for update或更改,直到完成第一个连接的事务为止。

可序列化隔离级别不需要关注更改,但确保在事务启动后,读取结果将始终保持不变(事务本身的更改除外),直到事务结束。要支持这种“非MVCC”,-DBMS必须在数据库中设置许多锁(由工作可序列化的连接读取的每条记录),因此可能会极大地阻碍并发性。

在数据库提供MVCC的情况下,也可以在不锁定的情况下实现与Oracle、MySql-INNODB、MariaDB、Postgres相同的效果。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47441027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档