2010-11-04 83 views
2

我发现这个great article关于表适配器的交易。但是,这篇文章并没有解释为什么交易是需要的甚至是理想的!我是否需要使用c#TableAdapter进行数据库事务?

为什么值得我尝试与我的TableAdapter一起实现事务?

+0

您是否在查找有关交易目的的文档? – 2010-11-04 10:34:04

+0

目的和一般良好做法将非常有帮助。 – 2010-11-04 10:36:29

+1

是的,你可以在交易中介绍后自行回答http://en.wikipedia.org/wiki/Database_transaction – Danil 2010-11-04 10:37:01

回答

3

假设在保存对数据库进行多次查询时发生的事情发生了问题。当您开始保存操作时,您想要保存的所有数据都会发生什么?大多数开发人员想要使之前保存的数据无效。 嗯..这就是交易的目的:你将所有的保存逻辑封装在一个事务中,这样如果/当中间发生不好的事情时,什么都不会被保存。

更多的交易主体:http://en.wikipedia.org/wiki/Database_transaction

1

“为什么”将执行的数据库操作作为一个更广泛的交易单元的一部分,这样就可以提交这个其他的东西在原子(全 - 或 - 无)的方式,或确保您的读取和写入发生在同一个事务中(以避免幻象/不可重复读取)。其实我不是适配器型号的巨大粉丝,但...

对于如何; TransactionScope会更简单,因为ADO.NET连接应自动招募:

using(var tran = new TransactionScope()) { 
    // do work A 
    // do work B 
    // do work C 
    tran.Complete(); 
} 

完成任务......

+0

不幸的是,由于数据库的配置,我不能使用TransationScopes,因为它们会提升多个Transaction动作分散。所以它看起来就像它对我来说长久而痛苦的“部分班级”方法! – 2010-11-04 11:37:48

0

交易可以维护数据库数据的一致性。通常最好在所有数据库更新/插入中引入事务。出于任何原因,如果指定的存储过程失败,则总是回滚。

1

如果你有一个情况,你有多个表,你想在原子调用中有一个保证更新,交易使这成为可能。如果没有事务处理,您可能会更新一个表格,然后第二个表格会失败,您将留下问题数据。 例如,您可能会遇到这样的情况:yuo有一个屏幕,并且想要通过单击一个按钮添加父记录和一堆子记录。如果没有交易,父母会成功保存,但其中一个孩子记录会爆炸。通过事务处理,您可以回滚整个事务并请求用户修复数据问题。

0

这些你们在这里发布的信息对我来说听起来不错,但我们不应该忘记,对于一个解决方案来说,总是有利和不利的 例如管理应用程序方面的交易(无所谓)要增加网络流量,因为.NET必须发送所有的命令到SQL Server:使用(VAR TRAN =新的TransactionScope()){

// do work A 

// do work B 

// do work C 

tran.Complete(); 

}

在这它必须发送“开始事务”和“提交”。

最糟糕的想法是如果在“//工作b”之后连接被切断,会发生什么?这意味着.Net将无法发送“回滚”或“提交”,因此我们将在SQL Server端打开可导致死锁的事务。

相关问题