死锁部分数据丢失?

时间:2015-07-11 15:53:25

标签: sql-server database-deadlocks

有人可以告诉我,如果SQL Server中的过程发生死锁,可能会导致仅从几个表中丢失数据吗?该过程已插入多个表中,但数据从几个表中丢失。这是可能的还是由于另一个问题而发生的?

还有一些表的部分数据丢失

1 个答案:

答案 0 :(得分:2)

默认情况下,事务需要在SQL Server中显式。因此,如果您的程序结构如下:

create procedure dbo.doStuff
as
begin
   update table1 …;
   update table2 …;
   delete table3 …;
   insert table4 …;
end

你在table3删除时遇到死锁,表1和2更新的结果应该被认为是持久的(也就是说,它们也不会被僵局和#39回滚。 ; s rollback)。如果您需要所有语句以原子方式成功/失败,则需要将整个事务包装在事务中。那就是:

create procedure dbo.doStuff
as
begin
   begin transaction;
      update table1 …;
      update table2 …;
      delete table3 …;
      insert table4 …;
   commit transaction;
end

请记住,这确实会对并发性产生影响(您可以长时间保持锁定) - 不要错过'免费。而且,虽然你不能依赖它,但它也可以影响哪个进程是死锁受害者(因为选择的部分是"回滚多少工作")!

如果你愿意的话,你可以(并且可能应该!)与begin tryxact_state()一起变得更加漂亮,但以上是基础知识。