2012-03-16 181 views
0

今天我读了JTA api,我看到了名为UserTransactionManager的类。我们必须在执行SQL查询之前开始我们的事务,以便如果发生任何异常,我们可以回滚这些更改。UserTransactionManager究竟做了什么

这里我的问题是UserTransactionManager究竟在做什么?它提供任何堆栈来执行SQL查询?它如何回滚SQL查询更改?

回答

1

UserTransactionManager是一个接口。您的容器在运行时提供了实现。

它使用了一个名为2阶段提交的进程,其中发生了“软提交”,并且行被保留在缓存中,然后在稍后进行硬提交。以下是基本概述:

当您使用XA协议打开事务时,容器与数据库进行通信,并说“嘿,给我一个连接,但实际上直到磁盘('提交')才写任何东西,直到我告诉你如此。”

接下来,您运行一些查询,并将其清除到数据库。当你刷新你的容器询问数据库时,“嘿,运行这些查询,但是直到我告诉你之前不要写任何东西,如果你不能保证它们立即成功抛出错误,如果它们成功,锁定行和表,直到你再次听到我的声音,我给你确定承诺“。

最后,程序关闭UserTransaction。然后容器对数据库说:“确定你锁定的所有行,将所有内容刷新到磁盘(提交)并解除锁定。”

这实际上更复杂一点,特别是当你协调全球交易......但基本上如果所有的参与者都同意他们可以保证提交,那么他们都承诺,或者没有人提交。

延伸阅读:

+0

谢谢你的快速回复。根据您的回答,集装箱充当交易协调员。那么编程式事务呢,那么UserTransactionManager就像一个协调器? – 2012-03-16 06:50:22

+0

它实际上仍然是管理交易的容器。 UserTransactionManager允许您的应用程序告诉容器何时/在何处/结束交易。 – 2012-03-16 06:59:52

+0

谢谢你的回答。 – 2012-03-16 10:17:46