2011-03-10 93 views
2

嗨我想看看什么是锁定数据库,并找到2种类型的锁定。乐观和悲观的锁定。我在Wiki上发现了一些文章,但我想知道更多!有人可以解释我关于这些锁定吗?当我们需要独占访问某些东西时,我们应该只使用锁定功能锁定只发生在我们使用交易时? 在此先感谢。锁定数据库

Kevin

回答

4

乐观锁定根本没有锁定。

它通过在开始进行更改之前记下系统所处的状态,然后继续前进并仅做出这些更改,假设(乐观地)没有其他人会想要发生冲突的更新。就像你要自动提交这些更改一样,你会检查是否有人同时也更新了相同的数据。在这种情况下,您的提交失败。

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

悲观锁与真正的锁的工作。假设存在争用,则在触摸之前锁定要更新的所有内容。其他人将不得不等待您提交或回滚。

当使用带有事务支持关系型数据库,该数据库通常需要在内部锁定的照顾,所以对正常的联机处理,你不需要处理这个自己(比如当你发出一个UPDATE语句)。只有当你想做维护工作或大批量时,你有时想锁定桌子。

,当我们需要的东西独占访问我们应该只使用锁定?

你需要它,以防止其他会话冲突操作。一般来说,这意味着更新。读取数据通常可以同时进行。当我们用交易

锁定只发生?

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

+0

所以你的意思是乐观锁会自动发生当我们插入,UPD吃和删除?有了交易,悲观锁定会发生吗?我对么 ? – kevin 2011-03-10 05:51:12

+0

不,您的常规RDBMS(如Oracle或SQL Server)会执行悲观锁定。当你更新行将被锁定。除非您承诺,否则其他人无法触碰它。 – Thilo 2011-03-10 06:30:17

+0

对不起,我很困惑。你能再详细一点吗?你是指当我使用事务或更新,删除或插入时发生悲观锁定?你说__乐观锁定是完全不锁定的,为什么它不锁定?对不起我的无知!谢谢你的时间! – kevin 2011-03-10 07:07:26

0

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

是否在读取数据时执行锁定以及请求何种类型的锁。

读锁持续了多长时间。

无论是读操作引用其他事务修改的行:

块,直到该行的排它锁被释放。

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

读取未提交的数据修改。

默认级别为: 未提交的读(最低水平,交易是孤立只不足以确保物理损坏的数据不被读取)

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

重复读

Serializable接口(最高水平,其中,所有交易都是完全相互隔离)