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

Leo*_*Bor 6 java database jpa locking transactions

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

Mik*_*ll' 9

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

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

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

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

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

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

  • @LeondBor:这样想。乐观和悲观并发控制给你两种选择。SQL 事务隔离级别为您提供四种选择。“并发”是一个话题;“事务隔离级别”是另一个话题。从长远来看,尝试将并发直接映射到事务隔离级别可能会导致麻烦。特别是因为事务隔离级别是用负面术语定义的——“不会”发生的事情。 (2认同)

asc*_*erk 8

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

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

当数据库提供 MVCC 时,不加锁也可以达到同样的效果,如 Oracle、MySql-INNODB、MariaDB、Postgres