我有一个正在访问数据库的控制台c#程序。
代码的一部分是进行一些插入和更新,我想用事务来控制这些插入和更新。这是代码中处理业务逻辑的部分。
代码的另一部分是进行一些插入和更新,这更像是我希望在插入时立即提交的系统支持逻辑。具体来说,这段代码是在程序启动时插入一行,并用末尾更新该行。它还将某些事件记录在代码中。我不希望这些记录的事件仅仅因为业务逻辑中出现故障而消失。
我试着用SqlCommand做这样的业务逻辑:
SqlCommand command = new SqlCommand(sql, connection, transaction);
系统逻辑如下:
SqlCommand command = new SqlCommand(sql, connection);
但我得到了这个错误:
ExecuteNonQuery要求命令在分配给命令的连接处于挂起的本地事务中。
我的目标是让业务逻辑只在transaction.Commit()
时提交,让系统逻辑立即提交。
我可以通过两个单独的交易来完成吗?
我需要打开两个不同的连接吗?
最后,我创建了两个不同的连接:一个用于基于事务的IO,另一个用于非基于事务的I/O。
然后,我使用如下代码在每个命令上设置事务:
transaction = new connection.BeginTransaction();
someCommand1.Transaction = transaction;
someCommand2.Transaction = transaction;
其中someCommand1/2是以前在代码中创建的SqlCommand((。
这样就避免了多次调用SqlCommand的问题。
结果证明代码非常干净。