Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 请提供交易使用指南_Sql_.net_Multithreading_Transactions_Isolation Level - Fatal编程技术网

Sql 请提供交易使用指南

Sql 请提供交易使用指南,sql,.net,multithreading,transactions,isolation-level,Sql,.net,Multithreading,Transactions,Isolation Level,我寻求有关交易的一些指导。本案: 我有一个带有几个常规字段和两个外键的表。在2个外键上有一个唯一的索引。这张表有好几条10万条记录。两个线程: 线程1是一个维护过程,它收集相当大的数据块,删除FK1=所在的所有记录,然后重新插入数千条具有相同FK1=的记录。删除和插入这些记录需要一分钟以上的时间。在这一分钟内,有几十次第二个线程从未启动过,第三个线程可能也会更新或插入一条记录,其中FK1=。在线程1工作期间发生这种情况时,有时会发生唯一索引冲突 关于线程1和2的事务,我可以/应该做什么,隔离级别

我寻求有关交易的一些指导。本案:

我有一个带有几个常规字段和两个外键的表。在2个外键上有一个唯一的索引。这张表有好几条10万条记录。两个线程: 线程1是一个维护过程,它收集相当大的数据块,删除FK1=所在的所有记录,然后重新插入数千条具有相同FK1=的记录。删除和插入这些记录需要一分钟以上的时间。在这一分钟内,有几十次第二个线程从未启动过,第三个线程可能也会更新或插入一条记录,其中FK1=。在线程1工作期间发生这种情况时,有时会发生唯一索引冲突

关于线程1和2的事务,我可以/应该做什么,隔离级别是什么。欢迎任何指导


提前感谢,1月

因为线程1和线程2都执行更新,所以它们永远不应该使用读取隔离一起运行。相反,我将把重点放在将线程1的事务发送分解为多个更小/更快的发送上

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


选择一个安静的时间来执行维护,以减少对用户体验的影响。

阅读更多内容后,似乎在线程1中将TransactionIsolationLevel设置为“可序列化”,应该可以保护线程1不受第二个线程执行的任何操作的影响。我说的对吗?Serializable可以不惜一切代价防止多个tx一起运行,这通常并不理想。在你的情况下,read Comited应该没问题。由于两个线程都执行更新,如果第一次发送获得FK=?写入锁以执行更新,第二个tx尝试更新FK=?将等待此锁释放。@gerrytan:谢谢您的评论。在先前的尝试中,线程1和第2个线程都使用读取提交的事务。当线程1忙于插入几个1000的记录时,第二个线程仍然能够插入冲突的记录。所以,雷德似乎不够坚强。显然,thread-1中的delete操作没有锁定到足以阻止第二个线程进行插入的程度。那么我建议您检查SQL,您是否有适当的事务边界?在大多数dbms中,它应该包含在BeginTransaction和commit中。一个常见的错误是您忘记了这个事务边界,并且您使用了自动提交模式-因此每个语句都是一个自己的事务。请记住,运行或未能运行单个事务都不应将数据更改为不一致的状态。再次感谢。约1分钟的作业已经是总任务的1/100:我可以更轻松地将总任务拆分为多个线程,但这永远无法完全解决问题,因为“第二线程”的调用一直有几十次。是的,通常这项大型任务在安静时间运行,但有时在高峰时间需要紧急维护: