1

如果我再次问同样的问题,我很抱歉。我尝试查找有关数据库锁定的信息,最后我感到困惑。我正在使用 Syabse ASE 并执行了以下操作

从 3 个终端连接到 sybase 并从每个连接开始一个事务。

交易 T1、T2、T3。

T1 和 T2 通过使用获取共享锁

共享模式下的锁表示例

T1 和 T2 正在执行选择操作

T3 来尝试更新它需要独占锁的示例表。自从我用过

设置锁定等待 60

T3 的更新语句会在 60 秒后被杀死。

现在 T1 尝试更新它需要独占锁的示例表。由于 T2 还在样本表上持有共享锁,因此 T1 现在将持有。由于 T1 没有任何等待超时,它将无限期地等待 T2 提交事务。

现在 T2 还尝试更新它需要独占锁的示例表。由于 T1 也在样本表上持有共享锁,sybase 将检测到死锁并杀死 T2 的更新语句,然后 T1 的更新语句成功执行。

假设首先请求更新的事务将成功完成,而另一个事务的语句将被 sybase 杀死。

现在 T2 再次尝试更新样本表。T2 无限期保持。

现在 T1 再次尝试更新示例表。这次T1的update语句会成功完成,T2还在等待。

这就是我感到困惑的地方。

T2 已首先请求更新。如果有死锁,这个时候 T1 应该被杀死。

我假设 T1 现在在第一次更新表时自动获得了对示例表的排他锁。

可以自动更改事务的锁吗?

然后后来我从 T1 执行了一个选择,它工作正常。假设排他锁将被释放并更改为共享。

接下来,我从 T1 执行了更新。T1 又结束了,T2 还在等待。

我应该在 T1 中明确将锁更改为共享吗?

我这样做了。我尝试通过使用将锁更改为共享

共享模式下的锁表示例

然后我收到了这条消息

数据库 'shmdb' 中的表 'sample' 未锁定为 'shared' 模式,因为在 'shared' 模式下找到了覆盖锁。

现在我检查了 T2 的状态。它还在等待。

然后我尝试从 T1 更新样本表,它运行良好,T2 仍在等待。

太多的混乱。

如何更改 T1 上的锁?提交事务将释放锁,T2 将运行良好。

这是唯一可能的方法吗?

4

1 回答 1

0

我假设在事务 T2 尝试更新表时,T1 已经在表上持有共享锁。在 T1 释放共享锁或持有的独占锁之前,T2 将无法更新。

直到事务 T1 持有锁,它才能根据需要多次更新表。

是的..你是对的 提交或回滚只释放表上的锁。

最小化死锁的其他方法是在表上保持行级锁定,这允许更新表中其他事务未使用的其他行。

于 2013-08-30T12:30:38.457 回答