如果我再问同样的问题,我很抱歉。我试着查找有关数据库锁定的信息,最后我感到很困惑。我正在使用Syabse ASE,我执行了以下操作
从3个终端连接到sybase,并从每个连接开始一个事务。
事务T1,T2,T3。
T1和T2通过以下方法获得共享锁
共享模式下的锁表示例
T1和T2正在执行选择操作
T3来并尝试更新它需要独占锁的示例表。因为我用过
设置锁等待60
T3的更新声明将在60秒后被杀死。
现在,T1尝试更新它需要独占锁的示例表。由于T2也对示例表持有共享锁,所以T1现在将保持不变。由于T1没有任何等待时间,所以它将等待不确定的时间,以便T2提交事务。
现在,T2还尝试更新它需要独占锁的示例表。由于T1还在示例表上持有共享锁,sybase将检测死锁并杀死T2的update语句,然后成功执行T1的update语句。
假设请求更新的事务将成功完成,而另一个事务的语句将被sybase杀死。
现在,T2再次尝试更新示例表。T2被无限期地搁置。
现在,T1再次尝试更新示例表。这次T1的update语句将成功完成,T2仍在等待。
这就是我困惑的地方。
T2首先请求更新。这一次,如果有一个死锁,T1应该被杀死。
我假设T1在第一次更新该表时会自动对sample表进行独占锁定。
事务的锁可以自动更改吗?
然后,我从T1中执行了一个选择,它运行得很好。假设将释放独占锁并将其更改为shared。
接下来,我从T1执行了一个更新。T1又完成了,T2还在等着。
我是否应该显式地将锁更改为在T1中共享?
是我干的。我尝试通过以下方法将锁更改为共享
共享模式下的锁表示例
然后我收到了这条消息
数据库'shmdb‘中的表'sample’没有被锁定在'shared‘模式中,因为在'shared’模式中找到了一个覆盖锁。
现在我检查了T2的状态。还在等着呢。
然后,我尝试从T1更新示例表,它运行良好,而T2仍在等待。
太混乱了。
如何更改T1上的锁?提交事务将释放锁,T2将运行良好。
这是唯一可能的方法吗?
发布于 2013-08-30 12:30:38
我假设在事务T2试图更新表时,T1已经在表上持有共享锁。T2将无法更新,直到T1释放共享锁或独占锁持有。
在事务T1持有锁之前,它可以随时更新表。
是的..。您是对的,只在表上释放锁。
最小化死锁的另一种方法是在表上保持行级锁,这允许更新表中其他未被其他事务使用的行。
https://stackoverflow.com/questions/18418111
复制相似问题