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

问题描述 投票:0回答:3

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

java database jpa transactions locking
3个回答
11
投票

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

我不喜欢术语“乐观锁定”和“悲观锁定”。我认为乐观并发控制悲观并发控制更准确。锁是处理并发控制问题最常见的方法,但并不是唯一的方法。 (《数据库系统简介》中关于并发的 Date 章节大约有 25 页长。) 事务管理并发控制的主题并不限于数据的关系模型或SQL数据库管理系统(dbms)。事务隔离级别与 SQL 有关。

悲观并发控制实际上仅意味着当 dbms 开始处理您的请求时,您期望 dbms 阻止其他事务访问

某物

。行为取决于 dbms 供应商。不同的供应商可能会通过锁定整个数据库、锁定某些表、锁定某些页或锁定某些行来阻止访问。或者 dbms 可能会阻止以不直接涉及锁的其他方式进行访问。 事务隔离级别是SQL尝试解决并发控制问题的方式。事务隔离级别在 SQL 标准中定义。 可序列化

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

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


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

Oracle、MySql-INNODB、MariaDB、Postgres等数据库提供MVCC时,无需加锁也能达到同样的效果


隔离级别

是对事务中可查看的数据的限制。

如果在提交之前其他事务没有更改任何数据,则序列化隔离

就会成功。固有的实现不应产生死锁。

串行化隔离的成本很高,因为需要进行额外的检查来确保一致性。因此,使用限制较少的隔离,但并发访问的数据库内容通过悲观/乐观锁定进行同步。

0
投票

悲观锁是尝试锁定资源,否则事务失败。从事务的角度来看,这是“快速失败”模式,这是死锁的真正根源。这不是事务隔离,而是并发访问的数据库内容的一种同步。

乐观锁根本不是锁,它只是提交之前的版本检查。

© www.soinside.com 2019 - 2024. All rights reserved.