我目前正在编写一个应用程序,需要为我的业务实体进行多次插入、更新和删除。我使用 TransactionScope 类来保证所有存储过程可以作为单个工作单元提交或回滚。
我的问题是,如果我在 .NET 类库中使用 TransactionScope 类,我的每个存储过程还需要使用 COMMIT TRAN 和 ROLLBACK TRAN 吗?
不,如果使用 TransactionScope 进行事务,则不需要显式事务 - 但是:重要,您可能应该在连接字符串中设置
Transaction Binding=Explicit Unbind;
。完整的详细信息位于here,但否则您最终可能会回滚前几个操作,并提交最后几个操作(或者更确切地说,在任何事务之外运行)。
2005 年没有必要,2000 年我会,而且,我通常将 transactionscope 放在“using”块中。
与 2005 相比,在 2000 及更早版本上使用它时会出现一些性能问题。
参见这里
谢谢
如果您加入了
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 中已发生变化。即使您不使用显式取消绑定,也不再可能回滚某些命令并提交某些命令。 (但是他是正确的,在旧版本中您应该使用显式解除绑定)。
您不应该需要 - 它应该在 TransactionScope 内处理。它确实有点取决于您正在做什么以及如何处理事务(显式或隐式)更多这里
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 立即提交。
请让我知道我的代码有什么问题