CommittableTransaction.Commit 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
尝试提交事务。
public:
void Commit();
public void Commit ();
member this.Commit : unit -> unit
Public Sub Commit ()
例外
调用了 Commit(),并且该事务第一次回滚。
注解
调用此方法时,将轮询已注册以参与事务的所有对象,并且可以独立指示其投票以提交或回滚事务。 如果任何参与者投票回退事务,则会回滚该事务,此方法将 TransactionException 引发异常。 这是事务的正常情况,代码应捕获和处理此类异常。
Commit 并 EndCommit 阻止,直到事务处理的第一阶段完成。 第一阶段在事务中的所有资源管理器和登记都投票决定事务结果后结束,并且 TransactionManager 已持续决定提交或中止事务。 处理的第二个阶段始终是异步的。 因此,不能保证刚从给定事务内提交的数据在不使用其他事务查看此数据时立即可用。
由于此方法会阻止事务处理的第一个阶段完成,因此在 Windows Form (WinForm) 应用程序中使用此方法时,应非常小心,否则会发生死锁。 例如,如果在一个 WinForm Control 事件中调用此方法 (,请单击按钮) ,并使用同步 Invoke 方法指示控件执行某些 UI 任务 (,例如,在处理事务过程中更改颜色) ,将发生死锁。 这是因为 Invoke 该方法是同步的,并阻止工作线程,直到 UI 线程完成其作业。 但是,在我们的方案中,UI 线程也在等待工作线程提交事务。 结果是,没有一个能够继续,范围会无限期地等待提交完成。 应尽可能使用,而不是尽可能使用BeginInvokeInvoke,因为它是异步的,因此更容易出现死锁。