发生数据库锁定时,哪些数据被锁定?

时间:2016-03-24 18:29:29

标签: database database-locking

我读了那个

  

“当多个用户需要同时访问数据库时会发生锁定。”,(ref

  

“存在数据库锁,以防止两个或多个数据库用户在同一时间更新同一段数据” - (ref)。

但是,我不明白发生数据库锁定时锁定了哪些数据。

第一个例子,两个用户运行sql同时选择多行。用户1排在第一位。

用户1:select * from products where price > 100;

用户2:select * from products where price < 100;

用户1查询是否会锁定用户2的数据库?

第二个例子,用户1想要更新产品表。用户2想要从产品表中选择数据。用户1排在第一位。用户1的操作会锁定用户2的数据库吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

最后回答你的问题,这取决于RDBMS架构。对于Ex。 1,答案几乎总是没有。读取不会阻止其他读取。对于Ex。 2,如果行在磁盘上的块中重叠,则可能存在争用。写入的意图通常不会阻止读取。这取决于您的数据库是使用乐观锁定还是悲观锁定。大多数现代系统都是乐观的,只有在记录更新时才会短暂锁定,并且不会阻止后续读取。

有几种类型的数据库锁。这些将取决于内部RDBMS架构,但我将展示一些相当广泛的MS SQL Server锁。它们可以按类型和范围隔离:

类型: 共享或读取锁定:共享访问权限。表示它正在读取数据的进程。允许并发读取。 独占锁:表示进程想要写入。不允许其他读取或写入。

范围: 表:锁定整个表。 阻止:锁定磁盘上的物理(或逻辑)块 行:锁定单个行。

这些是基本类型,每个数据库都有其他类型。读取可以同时完成,但写入需要按顺序完成。

例如,表截断可能会导致独占表锁。行更新可能会阻止块与其他读取和写入。

SQL Server还指定了用户定义的锁。这些可用于锁定触发器中的表。这些是一个不太理想的解决方案。它还具有意图锁(其他像Oracle没有),表明您打算更新记录,但可能会也可能不会更新它。如果您不小心使用触发器和存储过程,这些可能会导致死锁。

本文提供了有关SQL Server的更多信息:https://technet.microsoft.com/en-us/library/aa213039(v=sql.80).aspx

请参阅特定的数据库文档,了解它如何处理锁定。

答案 1 :(得分:0)

在两个示例中,每个用户只是尝试从数据库中读取数据,而不是更新数据库。所以两者都不会阻止对方。当用户开始被阻止时,是否有用户尝试更新数据库,那是;正如其他人所评论的那样,确切地说,这是一个非常广泛的问题。