我有点理解实体锁定和事务隔离级别的用途,但无法区分悲观锁定和可序列化级别。据我了解,在这两种情况下,表都被锁定并且没有其他事务可以访问它,因此在这两种情况下,数据库都会采取防止并发修改的措施,这看起来没有区别。有人可以解释一下这里是否真的有区别吗?
最佳答案
(我不假设您使用的是 ObjectDB。如果您编辑您的问题并包括您在 JPA 中使用的特定数据库,您可能会得到更好的答案。)
我不喜欢乐观锁定 和悲观锁定 这两个术语。我认为乐观并发控制和悲观并发控制更准确。锁是处理并发控制问题最常用的方法,但不是唯一的方法。 (Date 在数据库系统简介 中关于并发的章节大约有 25 页长。)
事务管理 和并发控制 的主题不限于数据的关系模型或 SQL 数据库管理系统 (dbms)。事务隔离级别与 SQL 相关。
悲观并发控制 仅意味着当 dbms 开始 处理您的请求时,您希望 dbms 阻止其他事务访问某物。行为取决于 dbms 供应商。不同的供应商可能会通过锁定整个数据库、锁定某些表、锁定某些页面或锁定某些行来阻止访问。或者 dbms 可能会以其他不直接涉及锁的方式阻止访问。
事务隔离级别是 SQL 尝试解决并发控制问题的方式。事务隔离级别在 SQL 标准中定义。
serializable 事务隔离级别保证并发的、可序列化事务的效果与按特定顺序一次运行一个事务相同。保证描述的是效果——不是实现该效果所需的任何特定类型的并发控制或锁定。
关于java - 悲观锁与可序列化事务隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47441027/