回滚c#
我有2个表查询和详细信息。 在保存按钮上单击我已写入
fbsave(); fbsavedetails();
fbsave()
将数据保存在查询表中, fbsavedetails()
将数据保存在详细信息表中。
现在如果在fbsavedetails()中发生错误,则两个步骤都应该回滚。
可能吗?
您可以显式创建一个事务并传递它,即
using(var connection = ...) { connection.Open(); using (var tran = connection.BeginTransaction()) { try { FBSave(connection, tran); FBSaveDetails(connection, tran); tran.Commit(); } catch { tran.Rollback(); throw; } } }
请注意,此处还必须在每个命令上设置Transaction
,因此需要将其传入,并且所有命令必须位于同一连接对象上。
或者:您可以使用TransactionScope
; 重要的是,在TransactionScope
内部发生Open()
以获得自动登记:
using(var tran = new TransactionScope()) { FBSave(); FBSaveDetails(); tran.Complete(); }
要么:
using(var tran = new TransactionScope()) using(var connection = ...) { connection.Open(); FBSave(connection); FBSaveDetails(connection); tran.Complete(); }
使用TransactionScope
方法,您不需要设置任何特殊的东西 – 大多数都是自动的。 您当然可以选择将连接传递给方法,但是它们也可以获得自己的连接,并且在大多数情况下它可以正常工作。
您可以使用TransactionScope。
using(var scope = new TransactionScope()) { //Complete the transaction only when both inserts succeed. scope.Complete(); }
如果您没有完成transactioncope,它将被回滚。
有两种方法可以解决这个问题
- 使用DbTransaction并在两个方法周围传递DbTransaction,如果成功则提交事务,如果发生错误则回滚:需要传递DbTransaction。
- 使用TransactionScope专业版:易于使用缺点:不支持访问,如果数据库是sql2000,则需要配置msdtc
- 如何通过SqlConnection获取上次执行的SQL查询?
- SQL Server的超时设置
- 非常缓慢的foreach循环
- 如何知道抛出SqlException的实际问题?
- 当DbDataAdapter.Update调用时,为什么我使用ODP.NET OracleDataAdapter获取OracleTruncateException而不使用System.Data.OracleClient的适配器?
- ADO.NET问题:何时使用DataReader,DataAdapter
- 我可以在.Net中加载到内存中的DataTable的最大大小是多少?
- 如何在DataGridView中获取选定的DataRow?
- 如何在我的应用程序中使用SELECT语句,该语句必须返回多个记录以显示某个字段的多个值(m:m关系)