0

我需要在数据库应用程序中为 sql 语句添加事务,到目前为止,我不需要这样做,因为我主要是提取数据,或者对现有数据进行非常小的更改。

我一直在使用嵌套 using 语句非常成功地使用整洁的构造,但我想与比我更了解的人核实这个修改后的构造是否可以在嵌入事务的情况下按我预期的那样工作。

        using (SqlCommand cmd = new SqlCommand())
        using (cmd.Connection = new SqlConnection()) {
            cmd.Connection.ConnectionString = "...";
            cmd.Connection.Open();
            using (SqlTransaction tran = cmd.Connection.BeginTransaction()) {
                // do the work (try catch wraps the statements)
                // commit transaction if no errors found or rollback
            }
            cmd.Connection.Close();
        }

提前谢谢你问候马丁

4

3 回答 3

1

TransactionScope有一个更易于使用的内置类。在一个using块中实例化它,其中的任何内容都将成为同一事务的一部分。

using(var ts = new TransactionScope())
using (SqlCommand cmd = new SqlCommand()) 
using (cmd.Connection = new SqlConnection()) 
{ 
  cmd.Connection.ConnectionString = "...";
  cmd.Connection.Open();

  // Do the work

  ts.Complete();

  cmd.Connection.Close();
}

如果发生任何异常,transactionscope 将在处置时自动中止所有操作。transactionscope 还影响在任何调用的函数中完成的任何操作,而无需传递 db 连接。

于 2012-04-23T15:41:13.787 回答
1

正如您所写的那样,它不起作用 - 您必须通过 SqlCommand 类的Transaction 属性将命令与事务相关联。此外,您可能必须先打开连接才能开始事务

使用 TransactionScope 更容易,但需要将数据库服务器设置为使用MSDTC

我们使用我工作的共享环境,MSDTC 不是一个选项。

于 2012-04-23T17:56:46.753 回答
0

而不是SqlTransaction,考虑使用TransactionScope.

TransactionScope您一起,您需要将其using声明包装在SqlConnection创建周围。为了提交,您需要Complete在块结束之前调用。

using (var tx = new TransactionScope())
using (SqlCommand cmd = new SqlCommand())
using (cmd.Connection = new SqlConnection()) 
{
    cmd.Connection.ConnectionString = "...";
    cmd.Connection.Open();

    // do the work (try catch wraps the statements)
    // commit transaction if no errors found or rollback

    tx.Complete(); // commits transaction
}
于 2012-04-23T15:44:06.580 回答