当前位置: 首页 > 知识库问答 >
问题:

锁定机制(悲观/乐观)与数据库事务隔离级别有什么关系?

段干安和
2023-03-14

我正在编写一个Web应用程序,其中两个不同的用户可以更新一个事物列表,例如待办事项列表。我开始意识到,乐观锁定机制效果最好,因为我不期望高争用。

我正在查看事务隔离级别,现在我有点困惑。看起来不同的事务隔离级别也解决了类似的问题。

这两个不同的概念是如何相互关联的?如果可能,举一个简单的例子。

共有2个答案

魏臻
2023-03-14

锁定机制通常用于实现事务隔离级别。因此,事务隔离级别定义了事务在并发执行中的行为方式。锁定机制是实现细节。

从应用程序编写的角度来看,您应该专注于设置适当的事务隔离级别。当然,设置特定的隔离级别意味着锁定,但只要您的应用程序不处于重载状态,您就不需要对其进行太多的处理。

重要的是数据库引擎之间的锁定机制不同。如果您为一个数据库编写应用程序,过一段时间后您将更改db引擎,您的应用程序可能会有不同的行为,或者它的某些部分可能需要重写。

我从15年的业务应用程序开发中得到的建议是不要依赖显式锁定。

养聪
2023-03-14

这两者都与数据一致性和并发访问有关,但它们是两种不同的机制。

锁定阻止对某些对象的并发访问。例如,当您尝试更新待办事项列表项时,悲观锁定数据库会在记录上放置行锁定,直到您提交或回滚事务,因此不允许其他事务更新相同的记录。乐观锁定是应用程序端检查记录的时间戳/版本在获取和尝试更新之间是否发生了变化。这与隔离事务级别无关。

事务隔离与读取一致性有关。

    < li >读取未提交级别允许会话查看其他会话的未提交更改 < li >读取提交级别仅允许会话查看其他会话提交的更改 < li >可序列化级别允许会话仅查看事务开始前提交的更改

看看下面的示例,我指出了不同事务隔离级别的查询结果。

SESSION 1                                  SESSION 2
--------------------------------           --------------------------------------
SELECT count(*) FROM test;
=> 10
                                           INSERT INTO test VALUES ('x');

SELECT count(*) FROM test;
=> 10 with read committed/serializable
=> 11 with read uncommited (dirty read)
                                           COMMIT;

SELECT count(*) FROM test;
=> 10 with serializable
=> 11 with read uncommitted/read committed

有四个ANSI指定的事务隔离级别(上面的示例中没有提到的一个是“可重复读取”),除了可序列化之外,所有这些级别都会出现一些异常。请注意,它与锁定无关。

您可以在这里查看Oracle文档,这些概念非常通用。

最后,您使用乐观锁定的方法对于web应用程序来说似乎是明智的。最有可能的是,您获取一个列表项并在两个不同的HTTP请求中更新它。不可能(或者至少是不明智的)在获取后保持事务打开并对记录进行显式锁定(您如何知道第二个请求是否会到达?)乐观的锁处理得很好。

 类似资料:
  • 我知道悲观锁定与锁定数据库记录,并在获得锁的“交易”结束时释放它。但这是否意味着悲观锁定是在物理交易中,例如 开始交易 提交事务? 对于一个网页,当用户选择要编辑的记录时,当他按下编辑按钮时,我想悲观地锁定此记录,以便其他人无法更改它,然后在编辑按钮onpress()事件中,我开始物理事务? 似乎是不可能的,因为编辑过程可能很长......它在整个编辑过程中保持数据库事务(按编辑按钮,在网页中编辑

  • 我有点理解实体锁定和事务隔离级别的目的,但不能得到悲观锁定和可序列化级别之间的区别。据我所知,在这两种情况下,表都被锁定,其他事务都无法访问它,因此在这两种情况下,防止并发修改的操作都是由DB执行的,看起来没有什么区别。谁能解释一下这里是否真的有区别?

  • 我正在阅读数据库锁定(悲观、乐观)机制, 会话1: t1:打开事务:< br> t2:睡眠(3秒)< br> t5:更新用户集名称='x ',其中id =1 会话2:t2:更新用户集名称=“y”,其中id=1 我的疑问是: 1. t5会发生什么2.它必须与隔离级别做任何事情吗?如果是,不同隔离级别的行为会是什么。3.数据库(mysql,orOracle)只做悲观锁定吗?

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁与悲观锁的具体区别: http://www.cnblogs.com/Bob-FD/p/3352216.html

  • 本文向大家介绍请你介绍一下,数据库乐观锁和悲观锁相关面试题,主要包含被问及请你介绍一下,数据库乐观锁和悲观锁时的应答技巧和注意事项,需要的朋友参考一下 考察点:数据库   悲观锁 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。悲观锁:假定会发生并发冲突,屏蔽一切可

  • 本文向大家介绍说一下乐观锁和悲观锁?相关面试题,主要包含被问及说一下乐观锁和悲观锁?时的应答技巧和注意事项,需要的朋友参考一下 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。 数据库的乐观锁需要自