在后台多个线程频繁建立事务修改数据,经常造成数据库锁表,导致其它线程无法读取或修改表中数据而报错,例如:
线程1:从a表中读取一批数据到dataset中,循环处理每一条数据
foreach(datarow row in dataset.tables[0].Rows){
//对每一条数据进行处理
....
//建立事务
修改b表数据
修改其它表中相关数据
//提交事务
}
线程2:从b表中读取一批数据到dataset中,循环处理每一条数据
foreach(datarow row in dataset.tables[0].Rows){
//对每一条数据进行处理
....
//建立事务
修改b表数据
修改其它表中的相关数据
//提交事务
}
在后台有一个定时器,每隔1分钟执行一次线程1,每隔1分钟执行一次线程2。由于两个线程都频繁创建事务修改b表,b表经常被锁,使得其中某一线程无法读取或者执行事务失败。
想把所有的update拼接在一起(用分号分隔),批量执行,不用频繁建立事务,但是经常由于字段太多,sql太长不能执行,
或者由于其中一条执行失败,这一批数据都要回滚,下一次又要从头执行,重新处理这一批数据。
所以想请问各位大侠,有什么办法可以尽可能减小锁表的频率,是否有别的方式可以进行批量处理??
------解决思路----------------------
这个问题有两种解决方案,第一个解决方案是休眠,一个循环跑完休眠一会释放time
第二个解决方案就是你这个不是因为事务锁表导致的问题,而是因为死锁的问题,
可以通过优化sql语句的方式解决
例如update 的更新条件,具体怎么做可以参考sql 死锁之类的文档。
------解决思路----------------------
你不显示地写事务语句,那么数据库默认地为每一条sql语句启动一个事务。
你多条语句拼成一个字符串,数据库也还是认识它是多条语句。
所以拼成一个字符串,只是为了应用程序写代码时的一种“手工”上少敲几行代码,说成是“批量执行、不用建立事务”都是错误的!
------解决思路----------------------

------解决思路----------------------
1.事务尽量小,执行时间尽可能短。里面最好不要包含很长和耗时的操作,比如select脏的操作最好不要包含进去;
2.设置隔离级别;
3.是否可以错开时间?是否2个线程获取的语数据杭高重复?这个业务上的东西就没法怎么说了。