使用C#更新数据库的事务
我正在做一个多层MVVM WPF应用程序,它连接到Oracle数据库。我需要一些关于交易范围的解释。考虑下面的例子:使用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实际插入记录。
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
}
}