可以监视死锁。当两个用户均保持锁定,并且每一个均想获取对方拥有的锁定时,就会发生死锁。
例如,用户 pradeep 对行 10 保持锁定。用户 jane 在行 20 上保持一个锁定。假设 jane 想要在行 10 上放置锁定,而 pradeep 想要在行 20 上放置锁定。如果两个用户均执行 SET LOCK MODE TO WAIT,那么他们可能永远相互等待下去。
GBase 8s 使用锁表自动检测死锁,并在他们出现之前就将他们停止。在一个锁定被获准之前,数据库服务器检查每个用户的锁定列表。 如果一个用户对请求者想要锁定的资源保持着锁定,数据库服务器就为该用户遍历锁定等待列表,以查看该用户是否正在等待请求者保持的任何锁定。 如果答案为是,那么请求者会收到一条死锁错误。
如果应用程序频繁地更新同一行,死锁错误可能是不可避免的。 然而,某些应用程序可能总在相互发生争用。 请检查正在产生大量死锁的应用程序,并试着在不同的时间运行它们。
要监视死锁数,请使用 onstat -p 输出中的 deadlks 字段。
在分布式事务中,数据库服务器不检查来自其他数据库服务器系统的锁表,因此无法在死锁发生前就检测到。 但是,您可以设置 DEADLOCK_TIMEOUT 配置参数。DEADLOCK_TIMEOUT 指定在返回一条错误之前,数据库服务器将等待远程数据库服务器响应的秒数。尽管除分布式死锁以外,还有其他原因也可能导致延迟,但此机制可以避免一个事务无限期地挂起。
要监视分布式死锁超时的个数,请使用 onstat -p 输出中的 dltouts 字段。