在单个调用中执行的一组 sql 命令被视为在事务中

Set of sql commands executed in single call considered as under transaction

如果我在单个 SqlCommand.ExecuteReader() 中执行一组 sql 命令,我可以将它们视为默认交易还是我应该明确表达交易?

.NET 模式 using(var scope = new TransactionScope) {...} 是否足以使其成为事务性的,以防万一不是?

命令批处理的第一部分是根据第二部分更新的 table 值声明 table 变量。

DECLARE @tempTable TABLE (ID int,...)
INSERT INTO @tempTable (ID,...)
SELECT [ID],.. FROM [Table] WHERE ... 

第二部分是一组应该更新或插入的项目

IF EXISTS(SELECT 1 FROM @tempTable WHERE ID=@id{0})
BEGIN
    UPDATE [Table]
    SET ... WHERE ...
END ELSE BEGIN
INSERT INTO [Table] ([ID], ...) VALUES (@id{0}, ...)
END

将它们串联后,我将通过单个调用执行它们 SqlCommand.ExecuteQuery()

进行该批处理的原因是我想尽量减少 SQL 服务器和我的应用程序之间的参数重复传输,因为它们在该批处理的范围内是常量。

问的原因是为了防止冗余代码并了解 [Table] 中的原始数据(@tempTable 的来源)是否有可能在批处理的最后一个 update/insert 片段完成之前发生变化.

执行 SqlCommand 不会开始任何事务。

您有两个选择:

  1. 使用 "BeginTransaction" 连接并将事务对象传递给 SqlCommand
  2. 使用 TransactionScope,它使用 DTC 并允许您跨多个数据库管理事务

我会用第二个。