悲观锁定与Serializable事务隔离级别

时间:2017-11-22 17:50:20

标签: java database jpa transactions locking

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

答案 1 :(得分:2)

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

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

当数据库提供MVCC时也可以实现相同的效果,就像Oracle,MySql-INNODB,MariaDB,Postgres

一样提供MVCC