java - 悲观锁与可序列化事务隔离级别

标签 java database jpa transactions locking

我有点理解实体锁定和事务隔离级别的用途,但无法区分悲观锁定和可序列化级别。据我了解,在这两种情况下,表都被锁定并且没有其他事务可以访问它,因此在这两种情况下,数据库都会采取防止并发修改的措施,这看起来没有区别。有人可以解释一下这里是否真的有区别吗?

最佳答案

(我不假设您使用的是 ObjectDB。如果您编辑您的问题并包括您在 JPA 中使用的特定数据库,您可能会得到更好的答案。)

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

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

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

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

serializable 事务隔离级别保证并发的、可序列化事务的效果与按特定顺序一次运行一个事务相同。保证描述的是效果——不是实现该效果所需的任何特定类型的并发控制或锁定。

关于java - 悲观锁与可序列化事务隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47441027/

相关文章:

mysql - 为消息应用程序创建数据库

mysql - 错误代码 : 1064. 您的 SQL 语法有误;查看与您的 MySQL 服务器对应的手册

jpa - Spring 数据 JPA : get first record using @Query annotation on query method

java - Java EE 中已弃用的实体 Bean 与 @Entity 注释之间的关系?

java - 从窗口服务运行 jar 应用程序时对 Java 服务包装器的疑问

java - 在 GWT 应用程序中更新客户端站点数据的最佳方法

java - JTable 列中 Toedter 的 JDateChooser

sql-server - 仅使用 IP 连接到没有实例名称的 SQL Server 2008?

java - 如何在同一个 Hibernate 事务中运行原生 SQL 查询?

java - 以一致的速度将物体从 A 点移动到 B 点