新萄京【转】PostgreSQL分布式事务配置。编辑 Java 中之事务 — JDBC 事务及 JTA 事务。

XA是open
group提出的分布式事务处理规范,JTA支持XA规范,JTA就确定了接口,有些应用容器提供实现,也发一部分老三方的开源实现可用,比如Atomikos。

Java事务之花色有三种:JDBC事务、JTA(Java Transaction
API)事务、容器事务。
常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务多是根据JTA就,这是一个冲JNDI的,相当复杂的API实现。所以本文暂未讨论容器事务。本文主要介绍J2EE开发被少单比基本的工作:JDBC事务及JTA事务。

若PostgreSQL参与分布式事务(XA)处理,则需以配备文件postgres.conf中设置max_prepared_transactions参数,此参数用于指定分布式事务中少步提交准备工作的极端特别数量。默认值为0,此时非支持分布式事务。

JDBC事务

max_prepared_transactions参数值未应该小于max_connections参数值,这样各个一个session都足以至少有一个可用之准备工作。

JDBC的通行为概括业务是冲一个Connection的,在JDBC中凡是通过Connection对象进行事务管理。在JDBC中,常用之以及业务相关的点子是:
setAutoCommit、commit、rollback等。

1
2
max_connections = 100
max_prepared_transactions = 100

苟起standby服务器,则standby服务器上即时简单只参数值都非可知小于master服务器上之相应值。

新萄京 1

新萄京 2

脚看一个简练的JDBC事务代码:

JDBC事务的得失

新萄京 3

JDBC也用Java进行数据库的事情操作提供了极度核心的支持。通过JDBC事务,我们可以拿多独SQL语句放到跟一个业务中,保证其ACID特性。JDBC事务之要优点就是是API比较简单,可以兑现最基本的政工操作,性能为针锋相对比较好。

而是,JDBC事务有一个受制:一个 JDBC
事务不可知跳多独数据库!!!所以,如果提到到多数据库的操作还是分布式场景,JDBC事务就无法了。

JTA事务

何以用JTA

一般说来,JDBC事务就得化解多少的一致性等问题,鉴于他因此法相对简单,所以重重人口关于Java中的事体只掌握发生JDBC事务,或者有人知框架中的作业(比如Hibernate、Spring)等。但是,由于JDBC无法实现分布式事务,而现之分布式场景更是多,所以,JTA事务就应运而生。

倘,你在工作中没有碰面JDBC事务无法化解的观,那么只能说而做的种类还都极端小。拿电商网站以来,我们一般将一个电商网站横向拆分成商品模块、订单模块、购物车模块、消息模块、支付模块等。然后我们拿不同之模块部署及不同之机器及,各个模块之间通过远程服务调用(RPC)等方法进行通信。以一个分布式的系对外提供劳务。

一个付出流程将同多独模块进行互,每个模块都安排在不同的机械中,并且每个模块操作的数据库都无一致,这时候就无法用JDBC来保管作业。我们看一样段落代码:

新萄京 4

JTA事务比JDBC事务更强劲。一个JTA事务可以起多单参与者,而一个JDBC事务则于限在一个十足的数据库连接。下列任一个Java平台的机件都得以与届一个JTA事务中:JDBC连接、JDO
PersistenceManager 对象、JMS 队列、JMS
主题、企业JavaBeans(EJB)、一个之所以J2EE Connector Architecture
规范编译的资源分配器。

JTA的定义

Java事务API(Java Transaction API,简称JTA ) 是一个Java企业版
的应用程序接口,在Java环境遭到,允许就超多单XA资源的分布式事务。

新萄京 5

JTA和她的亲生Java事务服务(JTS;Java
TransactionService),为J2EE平台提供了分布式事务服务。不过JTA只是供了一个接口,并没有提供切实的落实,而是由j2ee服务器提供商
根据JTS规范提供的,常见的JTA实现有以下几种植:

1.J2EE容器所提供的JTA实现(JBoss)

2.单独的JTA实现:如JOTM,Atomikos.这些实现可使在那些无下J2EE应用服务器的环境里用来提供分布事事务保证。如Tomcat,Jetty以及日常的java应用。

JTA里面提供了 java.transaction.UserTransaction ,里面定义了下几乎单章程

begin:开启一个工作

commit:提交时作业

rollback:回滚当前业务

setRollbackOnly:把目前事务标记为回滚

setTransactionTimeout:设置工作之事件,超过这个波,就丢弃来十分,回滚事务

这里,值得注意的是,不是采取了UserTransaction就能将一般的JDBC操作直接改动成为JTA操作,JTA对DataSource、Connection和Resource
都是发生求的,只有切合XA规范,并且实现了XA规范之连带接口的类才能够与到JTA事务中来,关于XA规范,请圈本身之另外一首文章被出有关介绍。这里,提一词,目前主流的数据库都支持XA规范。

假如想采取用 JTA 事务,那么尽管需有一个兑现 javax.sql.XADataSource 、
javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC
驱动程序。一个实现了这些接口的驱动程序将得以参与 JTA 事务。一个
XADataSource 对象就是是一个 XAConnection 对象的工厂。XAConnection 是介入
JTA 事务之 JDBC 连接。

设运用JTA事务,必须采用XADataSource来产生数据库连接,产生的连接为一个XA连接。

XA连接(javax.sql.XAConnection)和非XA(java.sql.Connection)连接的别在于:XA可以涉足JTA的事体,而且不支持自动提交。

新萄京 6

方的事例就是是一个施用JTA事务的转速操作,该操作相对靠让J2EE容器,并且要经过JNDI的方获得UserTransaction和Connection。

标准的分布式事务

一个分布式事务(Distributed Transaction)包括一个事务管理器(transaction
manager)和一个要多独资源管理器(resource
manager)。一个资源管理器(resource
manager)是即兴档次的持久化数据存储。事务管理器(transaction
manager)承担在富有事务与单元者的相互通讯的责任。

JTA的贯彻方式也是因以上这些分布式事务参与者实现之,具体的关于JTA的贯彻细节无是本文的重要,感兴趣之同学可以翻阅JTA
深度历险 –
原理及贯彻。

关押上面关于分布式事务之牵线是无是跟2PC中之事务管理比较像?的却,2PC其实就是适合XA规范之事务管理器协调多独资源管理器的等同种实现方式。
我前面起几篇稿子关于2PC和3PC之,那几篇稿子被介绍过分布式事务中之事务管理器是如何协调多独事情的汇合交由或回滚的,后面我还会见出几篇稿子详细的介绍一下及分布式事务相关的内容,包括可无压全局工作、DTP模型、柔性事务等。

JTA的优缺点

JTA的长很强烈,就是供了分布式事务的化解方案,严格的ACID。但是,标准的JTA方式的事务管理在一般开销被连无常用,因为他来众多通病:

实现复杂

普通情况下,JTA
UserTransaction需要由JNDI获取。这意味着,如果我们采用JTA,就需要同时使JTA和JNDI。

JTA本身即是独笨重的API

平凡JTA只能够在应用服务器环境下用,因此用JTA会限制代码的复用性。

总结

Java事务的种有三种植:JDBC事务、JTA(Java Transaction
API)事务、容器事务,其中JDBC的事体操作用法比较简单,适合吃处理同一个数据源的操作。JTA事务相对复杂,可以用来拍卖越多独数据库的事务,是分布式事务的一样种植缓解方案。

此还要简单说一下,虽然JTA事务是Java提供的可用于分布式事务之均等法API,但是不同的J2EE平台的落实都未一致,并且还不是充分方便使用,所以,一般以品种中未极端用这种较为负责的API。现在标准比较常用之分布式事务解决方案主要发生异步消息确保型、TCC、最要命努力通知等。关于这几种植分布式事务解决方案,我会在末端的稿子中介绍。欢迎关注和交流。

发表评论

电子邮件地址不会被公开。 必填项已用*标注