询问者
关于BizTalk多机死锁问题

问题
全部回复
-
现在我们改变了BizeTalk的部署方式,做成了群集。按照BizeTalk的文档,在windows群集中添加了DTC资源组和BizeTalk的资源组,安装好BizeTalk。在测试群集时,我们把节点二停止或者关闭,资源组能快速地正常地切换到节点一。但是在关闭或者重启节点一时,资源组切向节点二,等待几钟后,出现DTC资源和BizeTalk的两个实例不能正常联机,只有当节点一启动之后,资源才能正常联机。也就是说,从节点二切到节点一是没有任何问题的,但从节点一切到节点二必须依赖节点一的正常工作,否则不能成功。
我想请教一下,这种情况是什么原因引起的?有没有工具和方法来查看是什么原因导致这种情况的出现? -
因为biztalk的所有操作都是基于事务的,如果是多机部署就是基于分布式事务的。
SQL adapter也不例外,并且事务隔离级别是最高级别Serializable 的,这意味着,只要某个连接比如说是连接A用select 访问一个table时,这个table1就是被范围锁锁住的状态,如果这个时候又有一个连接B要更新table1时就必须等待连接A释放table1。再稍微复杂点,连接A访问完table1后还有去访问table2,连接B在访问table1之前先访问table2,事情就可能发生了连接A访问了table1后要去访问table2,同时连接B访问完了table2要去访问table1,但是这时tabel1被连接A锁着,table2被连接B锁着,B在等A释放table1的锁,A在等B释放table2,这就死锁了。
这种情况,两个连接在第一次访问table1和table2时都是select访问,这时没必要把这个两个表用范围锁锁住(锁在当前事务完成后才能释放),只要设置为共享锁(select语句执行完锁即释放)能避免脏读即可,就是把select语句部分设置为“Read Committed”即可,这样table1,table2在select时就不会被锁,后面的访问也就不会被死锁。
所以在SQL adapter的sql语句中,把所有的select语句都加上‘With (Readcommitted)’ 覆盖默认的Serializeable ,比如这样:Select * from authors with (Readcommitted) where contract = 1
这样应该可以解决绝大部分的死锁问题。
专注于biztalk。 chnking.cnblogs.com- 已编辑 金剑忠 2009年7月5日 15:08