在单个调用中执行的一组 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 不会开始任何事务。
您有两个选择:
- 使用 "BeginTransaction" 连接并将事务对象传递给 SqlCommand
- 使用 TransactionScope,它使用 DTC 并允许您跨多个数据库管理事务
我会用第二个。
如果我在单个 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 不会开始任何事务。
您有两个选择:
- 使用 "BeginTransaction" 连接并将事务对象传递给 SqlCommand
- 使用 TransactionScope,它使用 DTC 并允许您跨多个数据库管理事务
我会用第二个。