数据库驱动程序是否需要支持分布式事务或数据库本身的支持需求?

时间:2016-07-19 10:02:17

标签: java transactions jta distributed-transactions

我想了解distributed transactions中的Java EE。在阅读了一些在线资料和书籍之后,我开始知道在Java EE中,有一个特定的API,称为JTA,它是Java EE的技术堆栈之一,用于处理分布式事务。除了JTA之外,还有其他概念,例如:2PC (two-phase commit) strategyXA, the eXtended Architecture

仅考虑数据库,我对分布式事务有以下问题:

Q1)分布式事务的真正支持是否来自数据库驱动程序本身?

Q2)数据库(真正的数据库)是否了解分布式事务,还是由其他组件处理?

有人可以帮我清理这些问题吗?

2 个答案:

答案 0 :(得分:1)

简而言之,它的数据库实际上具有事务功能。它的数据库必须关注提交后的数据是否一致并正确存储到磁盘。

同时,驱动程序可以帮助您管理交易。例如,在第一次请求时为您打开它或自动提交它。

编辑: 对不起,主要问题是关于分布式事务。 分布式事务由驱动程序和事务管理器处理。从数据库的角度来看,此事务没有什么特别之处。

答案 1 :(得分:0)

JTA(作为Java EE规范)定义了用于事务管理器与应用服务器(例如WildFly),应用程序(您的代码)和资源(例如数据库)的通信的接口(http://docs.oracle.com/javaee/7/api/javax/transaction/package-summary.html)。事务管理器实现规范,其目的是管理XA事务。事务管理器是Java EE应用程序服务器的一部分。

回答你的问题

A1)分布式/ XA事务由事务管理器作为应用程序服务器的一部分进行管理。应用程序服务器与数据库的任何交互都通过jdbc驱动程序(基于app服务器)。对于数据库是XA事务的完全参与者,数据库和驱动程序必须具有它的功能。

Jdbc规范定义了jdbc必须提供的接口,以便事务管理器能够管理它。请参阅PostgreSQL jdbc驱动程序包xa(https://github.com/pgjdbc/pgjdbc/tree/master/pgjdbc/src/main/java/org/postgresql/xa)或查看jdbc规范本身。

数据库必须提供正确响应jdbc驱动程序xa调用的功能,并且必须实现2PC。当事务管理器命令准备数据库时必须记住,有一些准备好的事务与这样的数据一起工作,以便在事务管理器调用 commit 之后能够完成它。 / p>

A2)如果您将XA事务理解为来自多个资源(某些数据库,jms代理)上的操作的事务复合,那么数据库本身没有任何其他参与者的概念(有多大XA交易是)。数据库只知道有一个XA交易而且我是参与者。

所有XA事务管理都是事务管理器的责任。数据库运行2PC,由事务管理器驱动。数据库只关心哪些数据是这种两阶段提交的一部分,并响应来自事务管理器的符合XA规范的调用。