加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

使用触发器时,SQL数据库处于锁定状态

发布时间:2022-10-16 21:31:54 所属栏目:MsSql教程 来源:网络
导读: 使用触发器时,SQL数据库处于锁定状态
sqlsql-servertriggers
使用触发器时,SQL数据库处于锁定状态,sql,sql-server,triggers,deadlock,sqltransaction,Sql,Sql Server,Triggers,Deadlock,

使用触发器时,SQL数据库处于锁定状态

sqlsql-servertriggers

使用触发器时,SQL数据库处于锁定状态,sql,sql-server,triggers,deadlock,sqltransaction,Sql,Sql Server,Triggers,Deadlock,Sqltransaction,我对僵局有意见我试图提供对数据库更新的sql依赖性我通过在一系列表上创建触发器来实现这一点。修改表时,我在辅助表中增加一个整数,例如[dbo].[counters]。然后,我在此表上放置一个SQL依赖项,以了解哪个表是从代码更新的但是,我放置触发器的目标表可以在事务中使用,在这种情况下,很容易使事务死锁i、 e。tbl1在insert/update/delete上具有触发器以更新计数器表tbl2在insert/update/delete上有触发器来更新计数器表事务A发生在threa

我对僵局有意见

我试图提供对数据库更新的sql依赖性

我通过在一系列表上创建触发器来实现这一点。修改表时,我在辅助表中增加一个整数,例如[dbo].[counters]。然后,我在此表上放置一个SQL依赖项,以了解哪个表是从代码更新的

但是,我放置触发器的目标表可以在事务中使用,在这种情况下,很容易使事务死锁

i、 e。tbl1在insert/update/delete上具有触发器以更新计数器表tbl2在insert/update/delete上有触发器来更新计数器表

事务A发生在thread1上tbl1被修改,这将触发计数器表的更新

事务B发生在thread2上tbl2被修改,这会触发计数器表的更新,线程2现在被阻塞,等待线程1

同时,在thread1上,事务A继续,并更新另一个表(tbl1或tbl2)

现在死锁发生,其中一个线程被选为牺牲品

我的问题是,是否有更好的方法来创建触发器以消除死锁的可能性?有人知道ASP.NET中默认的SQLDependency如何解决这个问题吗?

您能容忍未使用的计数器值吗?如果是这样Mssq触发器,更新计数器时只需退出交易。

确定汇总

死锁是由不同的事务同时在递增表上使用范围锁和行锁造成的

ASP.NET SQLDependency对触发器使用行锁提示来删除死锁场景。但是,它引入了阻塞行为,因此如果两个事务修改同一个递增表,则事务本质上是序列化的

MS支持部门建议将ROWLOCK提示更改为READPAST。如果同时修改递增表中的不同行,这将减少阻塞行为

由于通知不需要RDBMS的绝对ACID属性,一种高级策略可以是使用非阻塞全局变量(如context_info)作为一组二进制标志来存储行已更改的事实(这将删除同一表上的阻塞),但是,需要更改调用应用程序的逻辑才能处理和重置变量。

“我通过在一系列表上创建触发器来完成此操作。修改表时,我会在辅助表中增加一个整数,例如[dbo].[counters]。然后在此表上放置SQL依赖项,以了解哪个表是从代码更新的。”-这听起来像是一个非常糟糕的设计。什么是RDBMS?其中一些具有“序列”,基本上是递增表设置,但没有物理表。尽管如此,它们不存储其他信息,因此不会包含递增表的名称。。。您可能应该包括表和触发器定义。你想在这里做什么?不要使用触发器,它们只会带来麻烦…我不明白为什么它是一个糟糕的设计,因为它基于与asp.net中的SQLDependency几乎相同的体系结构。。显示如何使用aspnet_regsql.Ok更新我的调查来设置它。。ASP.net SQLDependency在更新期间使用行锁。这有助于减少死锁,因为以前存在更新查询为更新获取范围锁的情况。通过使用行锁,冲突现在变成了阻塞调用而不是死锁?

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!