今天我读到了关于JTA api的内容,我看到了名为UserTransactionManager的类。我们必须在执行SQL查询之前启动事务,这样如果发生任何异常,我们就可以回滚更改。
我的问题是UserTransactionManager究竟在做什么?它提供任何堆栈..来执行SQL查询?如何回滚SQL查询更改?
答案 0 :(得分:1)
UserTransactionManager是一个界面。您的容器在运行时提供实现。
它使用一个称为2阶段提交的过程,其中一个"软提交"发生并且行保持不变,然后是硬提交。以下是基本概述:
当你使用XA协议打开交易时,容器与数据库进行通信,并说"嘿,我给了我一个连接,但实际上没有写任何东西直到磁盘(' commit' )直到我告诉你。"
接下来,运行一些查询,并将它们刷新到数据库。当您清空容器询问数据库时,"嘿,运行这些查询,但在我告诉您之前不要写任何内容。如果你不能保证他们会立即成功抛出错误。如果它们会成功,请锁定行和表,直到您再次收到我的回复,然后我就可以提交确认"。
最后,您的程序将关闭UserTransaction。然后容器对数据库说,"确定你已锁定的所有行,将所有内容刷新到磁盘(提交)并解锁它们。"
它实际上更复杂,特别是当你有协调的全局事务时...但基本上如果所有参与者同意他们可以保证提交,那么他们都提交,或者没有人提交。
进一步阅读: