我现在无法测试它并立即获得解决方案,而且我还没有在MSDN上找到这些信息,也没有在Google上找到这些信息。
我被问到是否需要在一个事务中封装插入,删除和更新给定表中的记录的合并语句(如果在插入完成后,例如在更新期间发生故障),或者是否存在任何操作失败,整个合并也失败了。
如果我们加入一项交易,也许不会有害,但为了好奇,我们希望了解更多有关合并内部的信息。
答案 0 :(得分:22)
SQL Server中的任何语句本身都是一个事务。
也就是说,它是原子的:一切都成功或一切都失败
显式事务将用于将多个单个原子语句组合成一个大型原子事务。
这是MERGE之美:不需要明确的交易和3个单独的陈述。
答案 1 :(得分:2)
如果未启动显式,则SQL Server中的所有DML语句都在隐式事务中运行。当然,您仍然可以将其包装在您自己的显式事务中但不应该需要
答案 2 :(得分:1)
每个查询始终在事务中运行。如果您不创建事务,则查询本身具有自己的事务。如果出现任何问题,将回滚整个查询。
如果您想要进行更多的错误处理,您可能需要围绕它进行事务处理,但这不一定是数据库的一致性。
答案 3 :(得分:0)
就像其他人所说的那样,你不需要事务,但如果你正在做类似upsert的事情,你应该考虑你的事务隔离级别或提示。 Using merge for upserts can cause conflicts in the default configuration.