.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 deleteList=new List();//删除的表对象列表
                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,并不会中断该事务的执行,当该事务获得锁后会继续进行相应的事务处理
 


你可能感兴趣的:(.net)