首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据库锁定机制的工作原理

数据库锁定机制的工作原理
EN

Stack Overflow用户
提问于 2013-08-24 11:32:33
回答 1查看 4K关注 0票数 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的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将运行良好。

这是唯一可能的方法吗?

EN

回答 1

Stack Overflow用户

发布于 2013-08-30 12:30:38

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

在事务T1持有锁之前,它可以随时更新表。

是的..。您是对的,只在表上释放锁。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18418111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档