当您的程序遇到锁定了的数据时,锁模式决定会发生什么情况。当程序尝试访存或修改锁 定了的行时,会发生下列情况之一:
• 数据库服务器立即将 SQLCODE 或 SQLSTATE 中的错误代码返回到程序。
• 数据库服务器暂挂程序,直到放置了该锁的程序移除锁为止。
• 数据库服务器暂挂程序一段时间,然后,如果移除该锁,则数据库服务器将错误返 回代码发送至该程序。
使用 SET LOCK MODE 语句来在这些结果中选择。
11.11.1 等待锁
当用户遇到锁时,数据库服务器的缺省行为是将错误返回到应用程序。如果您愿意无限期 地等待锁(对许多应用程序来说,这是最好的选择),则可执行下列 SQL 语句:
SET LOCK MODE TO WAIT
当设置此锁模式时,您的程序通常忽略其他并发程序的存在。当您的程序需要访问另一程 序已锁定了的行时,它等待,直到移除该锁位置,然后再处理。在大多数情况下,觉察不 到该延迟。
您还可等待指定的秒数,如下例所示:
SET LOCK MODE TO WAIT 20
11.11.2 不等待锁
等待锁的缺点是等待时间可能变长(虽然正确设计的应用程序应短暂地保持它们的锁)。 当不可接受长时间延迟的可能性时,程序可执行下列语句:
SET LOCK MODE TO NOT WAIT
当程序请求锁定了的行时,它立即收到错误代码(例如,错误 -107 Record is locked),并 终止当前的 SQL 语句。该程序必须回滚它的当前事务并重试。
当程序启动时,初始的设置为不等待。如果您正在交互地使用 SQL 并看到与锁定相关的 错误,则请将锁模式设置为等待。如果您正在编写程序,请考虑使其成为程序首先执行的 嵌入式 SQL 语句之一。
11.11.3 等待有限的时间
您可使用下列语句要求数据库服务器设置等待的上限:
SET LOCK MODE TO WAIT 17
此语句对任何等待的长度放置 17 秒的上限。如果在那个时间内未移除锁,则返回错误代 码。
11.11.4 处理死锁
死锁是一对程序阻塞彼此的进度的情况。每一程序对其他程序想要访问的一些对象有锁。 仅当所有相关的程序将它们的锁模式都设置为等待锁时,才发生死锁。
当仅涉及单个网络服务器上的数据时,GBase 8s 数据库服务器立即检测到死锁。通过将错 误(错误 -143 ISAM error: deadlock detected)返回给要请求锁的第二个程序,它防止发生死锁。如果程序将它的锁模式设置为不等待锁,则程序收到该错误代码。如果即使程序将 锁模式设置为等待之后,它还收到与锁相关的错误代码,则您知道是由于即将发生的死锁。
11.11.5 处理外部的死锁
在不同数据库服务器上的程序之间也可发生死锁。在此情况下,数据库服务器不可立即检 测到死锁。(完善的死锁检测需要在网络中的所有数据库服务器之间大量的通信。)而是 每一数据库服务器对于程序可等待的时间量设置一个上限,来在不同的数据库服务器上获 得对数据的锁。如果到时间了,则数据库服务器假定发生死锁并返回一个与锁相关的错误 代码。
也就是说,当涉及外部的数据库时,每个程序都运行最大锁等待时间。DBA 可为数据库服 务器设置或修改该最大值。




