【问题标题】:Locking the database锁定数据库
【发布时间】:2011-03-10 03:34:55
【问题描述】:

您好,我正在尝试查看是什么锁定了数据库,并发现了 2 种锁定类型。乐观和悲观锁定。我在 Wiki 上找到了一些文章,但我想了解更多!有人可以向我解释那些锁定吗?我们应该只在需要独占访问某些东西时才使用锁定?锁定仅在我们使用事务时发生? 提前致谢。

凯文

【问题讨论】:

    标签: sql database performance relational-database


    【解决方案1】:

    乐观锁根本不是锁。

    它的工作原理是在您开始进行更改之前记录系统所处的状态,然后继续进行这些更改,假设(乐观地)没有其他人想要进行冲突更新。正如您即将自动提交这些更改一样,您将检查同时其他人是否也更新了相同的数据。在这种情况下,您的提交将失败。

    例如使用乐观锁的Subversion。当您尝试提交时,您必须处理任何冲突,但在此之前,您可以在工作副本上做任何您想做的事情。

    悲观锁适用于真实锁。假设会有争用,您在触摸之前锁定所有要更新的内容。其他所有人都必须等待您提交或回滚。

    当使用支持事务的关系数据库时,数据库通常会在内部处理锁定(例如当您发出 UPDATE 语句时),因此对于正常的在线处理,您不需要自己处理。只有当您想要进行维护工作或大批量时,您有时才需要锁定表。

    我们应该只在需要独占访问某些东西时才使用锁定?

    您需要它来防止来自其他会话的冲突操作。一般来说,这意味着更新。读取数据通常可以同时进行。

    只有在我们使用事务时才会发生锁定?

    是的。您将在进行交易时积累锁,并在交易结束时释放所有锁。请注意,自动提交模式下的单个 SQL 命令本身仍然是一个事务。

    【讨论】:

    • 所以你的意思是当我们插入、更新和删除时,乐观锁定会自动发生?对于事务,会发生悲观锁定吗?我说的对吗?
    • 不,您的常规 RDBMS(如 Oracle 或 SQL Server)执行悲观锁定。当您更新时,该行将被锁定。在您提交之前,其他人都无法触摸它。
    • 对不起,我很困惑。你能详细说明一下吗?您的意思是当我使用事务或更新、删除或插入时会发生悲观锁定?你说乐观锁根本就没有锁,那为什么不是锁呢?对不起我的无知!!!谢谢你的时间!!!
    • 乐观锁定不是锁定,因为您不会阻止任何人同时更新相同的数据。当他们尝试提交时,它只是成为第一个胜利者。考虑颠覆。您签出工作副本,然后可以更改文件。其他人也可以更改其工作副本中的相同文件。没有锁定。第一个提交通过,另一个将被告知文件在此期间已更改。 RDBMS 不能那样工作。当您更新一行时,它将立即被锁定。在您通过提交或回滚释放锁之前,没有其他人可以更新它。
    • 谢谢你!!!我看得更清楚。但我不知道颠覆,但我可以从你说的理解! :D
    【解决方案2】:

    事务隔离级别还指定了锁定行为。 BOL 指:事务隔离级别控制:

    读取数据时是否加锁,请求什么类型的锁。

    读锁持有多长时间。

    一个读操作是否引用了另一个事务修改的行:

    阻塞直到行上的排他锁被释放。

    检索语句或事务开始时存在的行的提交版本。

    读取未提交的数据修改。

    默认级别为: 未提交读取(事务被隔离的最低级别仅足以确保不读取物理损坏的数据)

    已提交读取(数据库引擎默认级别)

    可重复读取

    Serializable(最高级别,事务彼此完全隔离)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多