【发布时间】:2011-03-10 03:34:55
【问题描述】:
您好,我正在尝试查看是什么锁定了数据库,并发现了 2 种锁定类型。乐观和悲观锁定。我在 Wiki 上找到了一些文章,但我想了解更多!有人可以向我解释那些锁定吗?我们应该只在需要独占访问某些东西时才使用锁定?锁定仅在我们使用事务时发生? 提前致谢。
凯文
【问题讨论】:
标签: sql database performance relational-database
您好,我正在尝试查看是什么锁定了数据库,并发现了 2 种锁定类型。乐观和悲观锁定。我在 Wiki 上找到了一些文章,但我想了解更多!有人可以向我解释那些锁定吗?我们应该只在需要独占访问某些东西时才使用锁定?锁定仅在我们使用事务时发生? 提前致谢。
凯文
【问题讨论】:
标签: sql database performance relational-database
乐观锁根本不是锁。
它的工作原理是在您开始进行更改之前记录系统所处的状态,然后继续进行这些更改,假设(乐观地)没有其他人想要进行冲突更新。正如您即将自动提交这些更改一样,您将检查同时其他人是否也更新了相同的数据。在这种情况下,您的提交将失败。
例如使用乐观锁的Subversion。当您尝试提交时,您必须处理任何冲突,但在此之前,您可以在工作副本上做任何您想做的事情。
悲观锁适用于真实锁。假设会有争用,您在触摸之前锁定所有要更新的内容。其他所有人都必须等待您提交或回滚。
当使用支持事务的关系数据库时,数据库通常会在内部处理锁定(例如当您发出 UPDATE 语句时),因此对于正常的在线处理,您不需要自己处理。只有当您想要进行维护工作或大批量时,您有时才需要锁定表。
我们应该只在需要独占访问某些东西时才使用锁定?
您需要它来防止来自其他会话的冲突操作。一般来说,这意味着更新。读取数据通常可以同时进行。
只有在我们使用事务时才会发生锁定?
是的。您将在进行交易时积累锁,并在交易结束时释放所有锁。请注意,自动提交模式下的单个 SQL 命令本身仍然是一个事务。
【讨论】:
事务隔离级别还指定了锁定行为。 BOL 指:事务隔离级别控制:
读取数据时是否加锁,请求什么类型的锁。
读锁持有多长时间。
一个读操作是否引用了另一个事务修改的行:
阻塞直到行上的排他锁被释放。
检索语句或事务开始时存在的行的提交版本。
读取未提交的数据修改。
默认级别为: 未提交读取(事务被隔离的最低级别仅足以确保不读取物理损坏的数据)
已提交读取(数据库引擎默认级别)
可重复读取
Serializable(最高级别,事务彼此完全隔离)
【讨论】: