0

我读到了

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

或者

“存在数据库锁是为了防止两个或多个数据库用户在同一时间更新相同的确切数据”-(参考)。

不过,我不明白发生数据库锁定时哪些数据被锁定。

第一个例子,两个用户同时运行 sql 来选择多行。用户 1 先走。

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

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

用户 1 查询会为用户 2 锁定数据库吗?

第二个示例,用户 1 想要更新产品表。用户 2 想要从产品表中选择数据。用户 1 先走。用户 1 的操作会为用户 2 锁定数据库吗?

谢谢!

4

2 回答 2

1

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

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

类型:共享或读取锁定:访问是共享的。表示它正在读取数据的进程。允许并发读取。排他锁:表示一个进程要写。不允许其他读取或写入。

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

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

例如,表截断可能会导致排他表锁。行更新可能会锁定块以防止其他读取和写入。

SQL Server 还指定了用户定义的锁。这些可用于锁定触发器中的表。这些不是最佳解决方案。它还具有指示您打算更新记录的意图锁(Oracle 等其他人没有),但可能会或可能不会更新它。如果您对触发器和存储过程不小心,这些可能会导致死锁。

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

有关它如何处理锁的信息,请参阅您的特定数据库文档。

于 2016-03-24T19:09:30.603 回答
0

在您的两个示例中,每个用户都只是尝试从数据库中读取,而不是更新它。因此,双方都不会阻止对方。如果有用户试图更新数据库,那是用户开始被阻止的时候;正如其他人所评论的那样,究竟如何做到这一点是一个相当广泛的问题。

于 2016-03-24T18:38:37.563 回答