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

2022-09-02 13:34:38

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


答案 1

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

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

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

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

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

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


答案 2

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

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

当数据库提供MVCC时,也可以在不锁定的情况下实现相同的效果,就像Oracle,MySql-INNODB,MariaDB,Postgres一样。


推荐