是否有必要在事务中封装单个合并语句(带插入,删除和更新)?

时间:2011-02-25 12:37:28

标签: sql sql-server-2008

我现在无法测试它并立即获得解决方案,而且我还没有在MSDN上找到这些信息,也没有在Google上找到这些信息。

我被问到是否需要在一个事务中封装插入,删除和更新给定表中的记录的合并语句(如果在插入完成后,例如在更新期间发生故障),或者是否存在任何操作失败,整个合并也失败了。

如果我们加入一项交易,也许不会有害,但为了好奇,我们希望了解更多有关合并内部的信息。

4 个答案:

答案 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.