2015-07-11 60 views
0

有人可以告诉我,如果SQL服务器中的某个过程中发生死锁,可能会导致仅丢失几张表中的数据?该过程已插入几个表中,但数据从几张表中丢失。这是可能的,还是由于其他问题而发生?从死锁中部分数据丢失?

而且还从一些表

+1

如果插入失败,则不应打乱现有数据。当然,除非您正在执行插入操作的触发器,这些插入操作会更改数据,并且在没有事务保护的情况下运行潮湿且非常狂野。 –

+0

如果你插入到多个表中并且你的错误处理没有以正确的方式实现,那么当然可能只有部分数据被插入 –

+0

多表插入将是全或无的因为插入是在同一事务的上下文中完成的。在同一事务上下文中完成的所有修改都将被提交或回滚,导致回滚受害事务的死锁。 –

回答

0

默认情况下,一些局部数据丢失,交易需要在SQL Server的明确。所以,如果你的程序的结构是这样的:

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

并且出现在table3死锁删除,更新,以表1 & 2,应考虑耐用的结果(即,他们不会也被死锁的回滚所回滚)。如果你需要所有的语句成功/失败,你需要把整个事情包装在一个事务中。那就是:

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

请记住,这确实有并发影响(你持有到锁更长) - 是没什么免费的。而且,虽然你不能依赖它,但它也可以影响哪个进程是死锁受害者(因为选择的一部分是“将需要多少工作来回滚”)!

如果您愿意,您可以(也可能应该!)更加喜欢begin tryxact_state(),但以上是基础知识。

+0

感谢您的宝贵意见。这有助于战利品。 –