数据库锁定机制如何工作

时间:2013-08-24 11:32:34

标签: database sybase sybase-ase

如果我再次提出同样的问题,我很抱歉。我试图找到有关数据库锁定的信息,最后我很困惑。我正在使用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将正常运行。

这是唯一可行的方法吗?

1 个答案:

答案 0 :(得分:0)

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

直到事务T1持有锁,它能够多次更新表。

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

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