Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#更新数据库的事务_C#_.net_Transactions - Fatal编程技术网

使用C#更新数据库的事务

使用C#更新数据库的事务,c#,.net,transactions,C#,.net,Transactions,我正在做一个多层MVVM WPF应用程序,它连接到Oracle数据库。我需要一些关于交易范围的解释。考虑下面的例子: using (TransactionScope ts = new TransactionScope()) { ... bank.setID(BankName, Branch); check.addCheck(check); ... ts.Complete(); } 此代码仅供解释:bank.setID()更新记录,而addCheck实际插入记录。

我正在做一个多层MVVM WPF应用程序,它连接到Oracle数据库。我需要一些关于交易范围的解释。考虑下面的例子:

using (TransactionScope ts = new TransactionScope())
{
   ...
   bank.setID(BankName, Branch);

   check.addCheck(check);
   ...
   ts.Complete();
}
此代码仅供解释:
bank.setID()
更新记录,而
addCheck
实际插入记录。我不知道如何测试这个。我想在使用第二种方法插入之前执行数据库的更新和关闭,然后检查更新是否回滚。这已经对了吗?我走对了吗?这是
交易范围的目的吗


提前感谢

编辑:起初我不确定您是否理解DB事务,因此这里有一个非常简短的描述:

被设计成用一个机械装置包裹一个

您可以使用它包装一组应该与事务一起执行的操作,因此,如果您在一次更新中失败,则该事务中的所有DB操作都将回滚

您可以在
using
块中使用它,这样,如果代码抛出异常,事务将回滚,而不是提交到数据库

我想在使用第二种方法插入之前执行更新并关闭数据库,然后检查更新是否回滚。。。我走对了吗

是的。您的代码应该已经处理了它:

  • 如果数据库在
    addCheck
    执行插入操作之前关闭,则插入操作应引发异常
  • 由于抛出异常,
    Complete
    永远不会被调用
  • 当到达(隐藏的)
    finally
    块且未调用
    Complete
    时,finally块应自动回滚事务
我不知道如何测试这个

如果你想为你的代码写一个单元测试,那么我不会建议“在执行过程中采用DB脱机”的方法。


相反,我建议让您的数据库逻辑足够灵活,可以指向不同的数据库。然后,删除
addCheck
插入的表或某些列。尝试设置数据库,以便
setID
成功,但
addCheck
失败。

编辑:起初我不确定您是否理解数据库事务,因此这里有一个非常简短的描述:

被设计成用一个机械装置包裹一个

您可以使用它包装一组应该与事务一起执行的操作,因此,如果您在一次更新中失败,则该事务中的所有DB操作都将回滚

您可以在
using
块中使用它,这样,如果代码抛出异常,事务将回滚,而不是提交到数据库

我想在使用第二种方法插入之前执行更新并关闭数据库,然后检查更新是否回滚。。。我走对了吗

是的。您的代码应该已经处理了它:

  • 如果数据库在
    addCheck
    执行插入操作之前关闭,则插入操作应引发异常
  • 由于抛出异常,
    Complete
    永远不会被调用
  • 当到达(隐藏的)
    finally
    块且未调用
    Complete
    时,finally块应自动回滚事务
我不知道如何测试这个

如果你想为你的代码写一个单元测试,那么我不会建议“在执行过程中采用DB脱机”的方法。


相反,我建议让您的数据库逻辑足够灵活,可以指向不同的数据库。然后,删除
addCheck
插入的表或某些列。尝试设置数据库,以便
setID
成功,但
addCheck
失败。

TransactionScope
有很好的文档记录。它

为了测试它是如何工作的,不需要使数据库离线。使用以下代码段:

using (TransactionScope ts = new TransactionScope())
        {
           try
              {
              ...
               bank.setID(BankName, Branch);
               throw new System.InvalidOperationException("sht happens");
               check.addCheck(check);
               ...
               ts.Complete();
              }
          catch
              {
               //catch the exception
               //ts.Complete() is not called, thus update/insert rollbacks
              }
        }

TransactionScope
有很好的文档记录。它

为了测试它是如何工作的,不需要使数据库离线。使用以下代码段:

using (TransactionScope ts = new TransactionScope())
        {
           try
              {
              ...
               bank.setID(BankName, Branch);
               throw new System.InvalidOperationException("sht happens");
               check.addCheck(check);
               ...
               ts.Complete();
              }
          catch
              {
               //catch the exception
               //ts.Complete() is not called, thus update/insert rollbacks
              }
        }