在单个调用中执行的 sql 命令集被视为在事务下
本文关键字:事务 sql 调用 单个 执行 命令 | 更新日期: 2023-09-27 18:33:51
如果我在单个SqlCommand.ExecuteReader()
内执行一组sql命令,我可以默认将它们视为事务还是应该显式表达事务?
.NET
模式是否足以using(var scope = new TransactionScope) {...}
使其具有事务性,以防万一不是?
命令批处理的第一部分是基于第二部分中更新的表的值来声明表变量。
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 Server 和我的应用程序之间的参数重复传输,因为它们是该批处理范围内的常量。
询问的理由是防止冗余代码,并了解[Table]
(@tempTable
源)中的原始数据是否有可能在批处理的上次更新/插入片段完成之前更改。
执行 SqlCommand 不会开始任何事务。
您有两种选择:
- 从连接中使用"BeginTransaction"并将事务对象传递给SqlCommand 使用
- TransactionScope,它使用 DTC 并允许您跨多个数据库管理事务
我会使用第二个。