SqlServer可更新订阅中在订阅库并发获取最大单据号测试及解决法案!(二)

2015-07-24 06:07:07 · 作者: · 浏览: 4
那就想办法更改索引。

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,因此都在等待。结果再日志中是不会再出现死锁了!!~同步也是正常的!~而如果没有更改触发器,出现了死锁,并且要处理死锁,执行时间反而更长。

?

至此,同步中并发获取最大单据号的测试就到这吧。