.NET TransactionScope 类和 T-SQL TRAN COMMIT 和 ROLLBACK

问题描述 投票:0回答:5

我目前正在编写一个应用程序,需要为我的业务实体进行多次插入、更新和删除。我使用 TransactionScope 类来保证所有存储过程可以作为单个工作单元提交或回滚。

我的问题是,如果我在 .NET 类库中使用 TransactionScope 类,我的每个存储过程还需要使用 COMMIT TRAN 和 ROLLBACK TRAN 吗?

.net database tsql transactions
5个回答
8
投票

不,如果使用 TransactionScope 进行事务,则不需要显式事务 - 但是:重要,您可能应该在连接字符串中设置

Transaction Binding=Explicit Unbind;
。完整的详细信息位于here,但否则您最终可能会回滚前几个操作,并提交最后几个操作(或者更确切地说,在任何事务之外运行)。


2
投票

2005 年没有必要,2000 年我会,而且,我通常将 transactionscope 放在“using”块中。

与 2005 相比,在 2000 及更早版本上使用它时会出现一些性能问题。

参见这里

谢谢


1
投票

如果您加入了

TransactionScope
CommittableTransaction
,那么我强烈建议您NOT使用
begin transaction
SqlConnection.BeginTransaction
明确创建自己的本地事务。

TransactionScope
/
CommittableTransaction
是不同的“家族”,与
begin transaction
/
SqlTransaction

互斥

因此我不同意赛义夫·汗的观点。确实,System.Transactions 在 Sql 2000 上存在性能问题,因此最好使用 SqlTransaction 或

begin transaction
代替。但是,如果您这样做,那么您不应该同时使用 TransactionScope/CommittableTransaction。

顺便说一句,Marc Gravell 描述的行为在 .Net 4.0 中已发生变化。即使您不使用显式取消绑定,也不再可能回滚某些命令并提交某些命令。 (但是他是正确的,在旧版本中您应该使用显式解除绑定)。


0
投票

您不应该需要 - 它应该在 TransactionScope 内处理。它确实有点取决于您正在做什么以及如何处理事务(显式或隐式)更多这里


0
投票
using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
    {
        try
        {
            using (IDbConnection sqlConnection = GetDbconnection("SQL_CONNECTION_STRING"))
            {
                using (IDbConnection db2Connection = GetDbconnection("DB2_CONNECTION_STRING"))
                {
                    sqlConnection.Open();
                    db2Connection.Open();

                    string db2Query1 = "";  // INSERT QUERY
                    result = await db2Connection.QueryFirstOrDefaultAsync<bool>(db2Query1, new DynamicParameters(), commandType: CommandType.Text);
                    
                    string db2Query2 = "";  // INSERT QUERY
                    result = await db2Connection.QueryFirstOrDefaultAsync<bool>(db2Query2, new DynamicParameters(), commandType: CommandType.Text);

                    string procName = "SP_NAME";
                    DynamicParameters dynamicParams = new DynamicParameters();
                    dynamicParams.Add("Parameter1", "VALUE1", DbType.String);
                    GridReader sqlResult = await sqlConnection.QueryMultipleAsync(procName, dynamicParams, commandType: CommandType.StoredProcedure, commandTimeout: 30);
                    resultSet = await sqlResult.ReadAsync<T>();
                    int sqlExecResult = await sqlConnection.ExecuteAsync(procName, dynamicParams, commandTimeout: 30, commandType: CommandType.StoredProcedure);

                    scope.Complete();  // COMPLETE THE TRANSACTION
                    IsSuccess = true;
                }
            }
        }
        catch (Exception ex)
        {
            errorMessage = ex.Message;
            throw;
        }
    }

它不仅仅适用于 DB2,我可以看到一旦插入它就会立即提交。

但是 SQL Server 回滚工作正常。直到调用完成() SQL Server 等待提交,但 DB2 立即提交。

请让我知道我的代码有什么问题

© www.soinside.com 2019 - 2024. All rights reserved.