2011-02-03 114 views
0

有没有一种方法而没有要更新的记录在审计表中的记录(通过触发器)被锁定,由于其触发触发器是在事务内的更新。SQL更新没有数据库锁定

因此,我们有一个用户表和一个触发器,用于插入,更新,删除和记录更改后的值给某个审计表,但我不希望审计表被锁定,以防止触发其他触发器来执行操作在审计表上。

编辑:只是为了澄清,我有问题是多个表通过不同的触发器到同一个审计表上报,这样的更新一个表锁被更新的所有其他表。至于关于事务回滚是什么的担忧,这不是一个问题,因为审计表仅用于更改跟踪,并且如果记录回滚,如果审计表不回滚则不是问题。

我想到了一种可能的方式,但我不知道这是否可行(或如何去做),有没有一种方法可以让触发器使用新连接而不是最初调用的连接?

+0

如果事务回滚,您是否真的想要另一个进程在审计表中读取记录? – 2011-02-03 23:57:44

+0

我会假设,是的,你想要审核表的数据被锁定。您真正的问题可能是您在审计表上有一个连续的(可能是集群的)主键索引,这会对审计表的叶节点进行热点检查,导致审计表中的所有插入操作全部进入相同的叶节点页面时间。将主键更改为更随机的排序方式,这可以解决您的锁定问题。 – 2011-02-04 00:10:23

回答

0

这是不可能创建一个不至少将一个写锁被写入记录/页的动作。否则SQL Server会一直存在一致性问题。你应该从相反的角度看 - 需要访问的审计表(审计通常只读很少意味着没有更新)应使用其他进程

SET TRANSACTION ISOLATION LEVEL SNAPSHOT 
or 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

哪样脏读取(或无锁版本)从审计表

如果必须..
有分离使用服务代理通过而不是插入数据到一个中间表和具有该SSSB台异步激活线程写入从事务写入偷偷摸摸审计记录,让您的原始长时间运行的交易保持不变mmitted。