指导请使用交易

时间:2014-06-17 06:09:04

标签: sql .net multithreading transactions isolation-level

我寻求关于交易的一些指导。案例:

我有几个常规字段和2个外键的表。这两个外键有唯一索引。该表有几个100.000的记录。两个线程: 线程1是一些维护过程,它收集相当大的数据块,删除FK1 =的所有记录,然后使用相同的FK1 =重新插入数千条记录。删除并插入这些记录需要一分多钟。在这一分钟内,第二个线程(从不是第三个)启动了几十次,也可能更新或插入FK1 =的记录。当在线程1的工作期间发生这种情况时,有时会发生唯一的索引违规。

关于第1和第1主题的交易,我能做什么/应该怎么办? 2,什么隔离级别。欢迎任何指导!

提前致谢,Jan。

1 个答案:

答案 0 :(得分:0)

由于线程1和线程2都执行更新,因此它们不应该一起运行(使用read comitted isolation)。相反,我会专注于将线程1的事务(tx)分解为多个更小/更快的tx。

例如,对线程1 tx使用限制,这样您只对FK =?的前X行执行维护。在循环中执行此操作直到所有FK =?行被处理。如果其中一个tx只需要2-3秒,则线程2中的另一个tx可以在下一批线程1 tx运行之前运行。

选择安静的时间进行维护以减少用户体验影响。