.net项目: Lock request time out period exceeded问题

异常信息:

Event:1222
Message:System.Data.SqlClient.SqlException (0x80131904): Lock request time out period exceeded.

问题描述:

TVP存储过程中设置了time out=1000,其他为默认事务设置。使用TVP批量删除[插入/更新]时,在事务操作中由于锁造成其他事务操作的阻塞,导致1222 Event,即锁请求超时

解决方法:

这里并不是完全解决锁超时现象,而是尽量可能早的释放锁,减少锁超时被命中的几率

如:TVP删除数据总量10w条

外层循环1000次,每次删除100条,如果每次删除的数量越小,事务就会越早释放锁,从而是其他事务获得该锁

在循环到某个次数,如50次时,使本线程cup休眠若干毫秒,让其他事务获得该锁

c#伪代码:

                IList<T> deleteList=new List<T>();//删除的表对象列表
                int total = 100000;//数据总量
                int num = 100;//每次删除的数量
                int degree = 50;//循环degree此后进入休眠
                int sleepTime = 5;//休眠毫秒数
                for (int i = 0; i < total/num; i++)
                {
                    TVPBulkDelete(deleteList);//批量删除num条
                    if(i%degree==0)
                        Thread.Sleep(sleepTime);
                }

ps:一旦发生lock time out,事务处理机制会发出一个1222 Event,并不会中断该事务的执行,当该事务获得锁后会继续进行相应的事务处理
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值