我是否需要使用c#TableAdapters进行数据库事务?

时间:2010-11-04 10:29:33

标签: c# transactions tableadapter

我在使用表适配器的事务上找到了这个great article。但是,本文没有解释为什么需要进行交易甚至是可取的!

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

5 个答案:

答案 0 :(得分:3)

假设当您正在保存对数据库进行多个查询的内容时会发生错误。在开始保存操作时,您希望在保存的所有数据中发生什么? 大多数开发人员希望使之前保存的数据无效。 嗯..这就是交易的用途:你在事务中封装了所有的保存逻辑,这样如果/当中间发生了不好的事情,就不会保存任何内容。

有关交易主题的更多信息:http://en.wikipedia.org/wiki/Database_transaction

答案 1 :(得分:1)

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

如何; TransactionScope会更简单,因为ADO.NET连接应该自动登记:

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

完成工作......

答案 2 :(得分:1)

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

答案 3 :(得分:0)

事务允许您维护数据库中的数据一致性。通常首选在所有数据库更新/插入中引入事务。如果指定的存储过程因任何原因失败,则始终回滚。

答案 4 :(得分:0)

你们这里发布的这一切对我来说听起来不错,但我们不应该忘记,对于一个解决方案,总有优势和劣势 例如,在应用程序端管理事务(无论如何),您将增加网络流量,因为.net必须将所有命令发送到SQL Server:

使用(var tran = new TransactionScope()){

// do work A 

// do work B 

// do work C 

tran.Complete(); 

}

在这种情况下,它必须发送“开始事务”和“提交”。

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