update [dbo].[BillNumberRecord]setmsrepl_tran_version=@c7
where [Guid] = @c1 and [Account] = @c2
?
最后解决死锁方法是:
更改同步触发器[dbo].[trg_MSsync_upd_BillNumberRecord]
?
将触发器内的更改语句注释。
update[dbo].[BillNumberRecord] set msrepl_tran_version = @c7
where [Guid] = @c1 and [Account]= @c2
?
设置新的更新方法,并强制加上聚集索引。这样就能使用聚集索引查找,并且是聚集索引更新!
update bsetmsrepl_tran_version=@c7
from [dbo].[BillNumberRecord]asbwith(index=IX_BillNumberRecord)
where [Guid] = @c1 and [Account]= @c2
?
测试的时候打开了十几个SQLQuerySrees,除了几个是其他账号,其余都是相同账号。
这里要说明一下,为什么打开十几个。
因为我们要模拟十几个账号同时操作。SQLQuerySrees虽然有两个选择设置——迭代次数和线程数。
迭代次数:是重复执行的次数
线程数:是创建多少个新的数据库session连接
?
迭代次数和线程数只是模拟并发,为了模拟在某一时刻同时操作才设置更多。虽然打开不同线程,但是似乎还是顺序创建。
?
这是某一刻查看的锁资源情况,如下图
?
此刻只有spid=199 的会话正在获取单据号,使用的是范围锁 RangX_X,并且对表加上意向排他锁(只能查询不能更改),而其他线程都是在查询单据号并想获取锁RangS_U,因此都在等待。结果再日志中是不会再出现死锁了!!~同步也是正常的!~而如果没有更改触发器,出现了死锁,并且要处理死锁,执行时间反而更长。
?
至此,同步中并发获取最大单据号的测试就到这吧。