首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表锁抛出异常与表锁等待结束

表锁抛出异常与表锁等待结束
EN

Stack Overflow用户
提问于 2016-01-25 13:38:41
回答 1查看 422关注 0票数 4

现在我想知道,为什么ADO.NET有时会直接抛出一个表锁异常,当一个表被锁定,而有时被执行的语句等待,直到表不再被锁定。表锁什么时候会导致异常,什么时候不会?遗憾的是,我没有重现这两种情况的代码。

Sybase SQL anywhere中是否有指定此行为的规则?

谢谢大家!

EN

回答 1

Stack Overflow用户

发布于 2016-09-21 04:13:23

Sybase和MsSql共享相同的历史代码库。回到过去( sql 2000之前)和Sybase的同一时代。两家供应商都没有解决他们的锁定问题。他们每个人都会陷入死锁的境地。问题出在他们使用的逻辑上。想象一下一个死锁的情况,比如在4路停车时驾驶一辆汽车。想象一下,当两个记录(汽车)同时进入时,规则会说向右让步。这很好用,除非在4辆车同时到达的情况下,每辆车都试图让路给右边的车。你会遇到一个死锁的情况。在过去,DBA必须选择一条记录来终止该事务(阻止其完成),以便清除死锁。后来,MsSql实现了自动选择要终止的记录的逻辑。他们还改进了他们的锁定逻辑,因此在未来的版本中死锁的频率要低得多。因此,它有时工作,有时不工作,是由你的记录驱动的,是被选择要终止的那个,还是其他死锁完成,允许你的记录被处理。

Oracle的锁定逻辑做得更好。它们保留给定字段的多个副本,这取决于是否有多个进程在同时修改该字段。当您执行select操作时,您将获得已经提交的记录,而不是长时间运行Sybase/MsSql锁定方案等待完成的未完成进程。后来的MsSql版本比SQL7和SQL2000做得更好,这是一个更大的问题。Sybase可能也经历了同样的改进。

有一些方法可以减少这种锁定问题,方法是将大表分解为较小的表,然后批量地从较小的表更新到较大的表。把它想象成一张左右的桌子。当您进行大容量插入到活动的左表时,右表被插入到主表中。然后切换到右侧表,并在将左侧表移动到主表时对右侧表进行大量插入。这将分解表之间的事务,并减少多个进程同时命中同一个表的机会(减少死锁)。但这意味着您没有最新的数据,因为您的左表和右表中有未完全处理的记录。

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

https://stackoverflow.com/questions/34985801

复制
相关文章

相似问题

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