有人可以告诉我,如果SQL服务器中的某个过程中发生死锁,可能会导致仅丢失几张表中的数据?该过程已插入几个表中,但数据从几张表中丢失。这是可能的,还是由于其他问题而发生?从死锁中部分数据丢失?
而且还从一些表
有人可以告诉我,如果SQL服务器中的某个过程中发生死锁,可能会导致仅丢失几张表中的数据?该过程已插入几个表中,但数据从几张表中丢失。这是可能的,还是由于其他问题而发生?从死锁中部分数据丢失?
而且还从一些表
默认情况下,一些局部数据丢失,交易需要在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 try
和xact_state()
,但以上是基础知识。
感谢您的宝贵意见。这有助于战利品。 –
如果插入失败,则不应打乱现有数据。当然,除非您正在执行插入操作的触发器,这些插入操作会更改数据,并且在没有事务保护的情况下运行潮湿且非常狂野。 –
如果你插入到多个表中并且你的错误处理没有以正确的方式实现,那么当然可能只有部分数据被插入 –
多表插入将是全或无的因为插入是在同一事务的上下文中完成的。在同一事务上下文中完成的所有修改都将被提交或回滚,导致回滚受害事务的死锁。 –