如果我再次提出同样的问题,我很抱歉。我试图找到有关数据库锁定的信息,最后我很困惑。我正在使用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的更新声明将成功完成,T2仍在等待。
这是我感到困惑的地方。
T2首先要求更新。如果存在死锁,则应该杀死T1。
我认为T1在第一次更新表时会自动对样本表进行独占锁定。
交易锁定可以自动更改吗?
然后我从T1执行了一个选择,它工作正常。假设将释放独占锁并将其更改为共享。
接下来我从T1执行了更新。 T1再次完成,T2仍在等待。
我应该明确地将锁定更改为T1中的共享吗?
我这样做了。我尝试使用
将锁更改为共享以共享模式锁定表格样本
然后我收到了这条消息
表&#39>样本'在数据库' shmdb'没有被锁定在共享的#39;模式因为a 覆盖锁定共享'模式被发现。
现在我检查了T2的状态。它还在等待。
然后我尝试从T1更新样本表,它运行正常,T2仍在等待。
太混乱了。
如何更改T1上的锁定?提交事务将释放锁定,T2将正常运行。
这是唯一可行的方法吗?
答案 0 :(得分:0)
我假设当事务T2尝试更新表时,T1已经在表上持有共享锁。 T2将无法更新直到T1释放共享锁或持有的独占锁。
直到事务T1持有锁,它能够多次更新表。
是的..你是对的提交或回滚只释放表上的锁。
最小化死锁的其他方法是在表上保持行级别锁定,以允许更新表中未被其他事务使用的其他行。