有人可以告诉我,如果SQL Server中的过程发生死锁,可能会导致仅从几个表中丢失数据吗?该过程已插入多个表中,但数据从几个表中丢失。这是可能的还是由于另一个问题而发生的?
还有一些表的部分数据丢失
答案 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 try
和xact_state()
一起变得更加漂亮,但以上是基础知识。