我在使用表适配器的事务上找到了这个great article。但是,本文没有解释为什么需要进行交易甚至是可取的!
为什么值得我尝试与TableAdapter一起实现事务?
答案 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端打开一个可能导致死锁的已打开事务。