首页 JavaEE5学习笔记01-JTA和数据库事务

JavaEE5学习笔记01-JTA和数据库事务

举报
开通vip

JavaEE5学习笔记01-JTA和数据库事务JavaEE5学习笔记01-JTA和数据库事务Email:suhuanzheng7784877@163.com刘岩1.前言JavaEE5的标准已经不是新鲜东西了,现在出了JavaEE6的标准,不过因为应用服务器像Weblogic和Websphere还没有大力支持呢,所以暂时先放放。JavaEE5是以EJB3.0为核心内容所出的标准。主要有: Servlet2.5JSP2.1JSF1.2JSTL1.2JTA1.1JPA2.0EJB3.0JMS1.1JavaMail1.4以上就是JavaEE5提出的相关标准因为JPA在...

JavaEE5学习笔记01-JTA和数据库事务Email:suhuanzheng7784877@163.com刘岩1.前言JavaEE5的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 已经不是新鲜东西了,现在出了JavaEE6的标准,不过因为应用服务器像Weblogic和Websphere还没有大力支持呢,所以暂时先放放。JavaEE5是以EJB3.0为核心内容所出的标准。主要有: Servlet2.5JSP2.1JSF1.2JSTL1.2JTA1.1JPA2.0EJB3.0JMS1.1JavaMail1.4以上就是JavaEE5提出的相关标准因为JPA在笔者的博客中单独有 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf ,在此系列不再做出总结,至于JSF等Web前端技术,之后会做一个文档形式的总结的。笔者是以Jboss5作为应用服务器(尽管JBoss6已经出了,并且支持JavaEE6标准),JDK版本是1.6.22,开发IDE为MyEclipse8.6.1。2.JTA简介JTA(JavaTransactionAPI)提供了事务划分接口标准,比如同一个数据库的事务,跨数据库访问业务的全局事务。在JavaWeb当中可能事务并不是十分重要(相对来说),而在JavaEE企业级开发,比如涉及到金额的电信、银行、商务等等对事务比较敏感的系统中,那么事务控制就是一个重点中的重点了。JavaEE通常分为局部事务(LocalTransactionProcessing)和全局事务(DistributedTransactionProcessing)。如果业务是单一数据源就是用局部事务就可以了,如果需要多个数据源就需要全局事务来保证对外是透明的、就跟一个数据源没两样的策略。3.简单的JTA例子比如说我的数据库记录目前记录如下 Id是主键之后我们在JBOSS中配置2个XA类型的数据源同时指向这一个数据库。 oracle1数据源配置内容如下 <?xmlversion="1.0"encoding="UTF-8"standalone="yes"?><datasources><xa-datasource><jndi-name>oracle1</jndi-name><rar-name>jboss-xa-jdbc.rar</rar-name><use-java-context>true</use-java-context><connection-definition>javax.sql.DataSource</connection-definition><jmx-invoker-name>jboss:service=invoker,type=jrmp</jmx-invoker-name><min-pool-size>0</min-pool-size><max-pool-size>10</max-pool-size><blocking-timeout-millis>30000</blocking-timeout-millis><idle-timeout-minutes>30</idle-timeout-minutes><prefill>false</prefill><background-validation>false</background-validation><background-validation-millis>0</background-validation-millis><validate-on-match>true</validate-on-match><no-tx-separate-pools/><statistics-formatter>org.jboss.resource.statistic.pool.JBossDefaultSubPoolStatisticFormatter</statistics-formatter><isSameRM-override-value>false</isSameRM-override-value><allocation-retry>0</allocation-retry><allocation-retry-wait-millis>5000</allocation-retry-wait-millis><application-managed-securityxsi:type="securityMetaData"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/><metadata><type-mapping>Oracle9i</type-mapping></metadata><type-mapping>Oracle9i</type-mapping><user-name>system</user-name><password>111111</password><exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name><prepared-statement-cache-size>0</prepared-statement-cache-size><share-prepared-statements>false</share-prepared-statements><set-tx-query-timeout>false</set-tx-query-timeout><query-timeout>0</query-timeout><use-try-lock>60000</use-try-lock><xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class><xa-datasource-propertyname="URL">jdbc:oracle:thin:@127.0.0.1:1521:jbossdemooracle</xa-datasource-property><xa-resource-timeout>0</xa-resource-timeout></xa-datasource></datasources>oracle2内容和它差不多,只是jndi-name不同而已。下面是未加事务控制的测试代码 try{ Contextctx=newInitialContext(); DataSourceds1=(DataSource)ctx.lookup("java:/oracle1"); DataSourceds2=(DataSource)ctx.lookup("java:/oracle2"); Connectionconnection1=ds1.getConnection(); Connectionconnection2=ds2.getConnection(); Statementstatement1=connection1.createStatement(); Statementstatement2=connection2.createStatement(); Stringsql1="insertintojimmy_uservalues(3,'青阳子')"; Stringsql2="insertintojimmy_uservalues(2,'非凡公子')"; intsun1=statement1.executeUpdate(sql1); intsun2=statement2.executeUpdate(sql2); statement1.close(); connection1.close(); statement2.close(); connection2.close(); }catch(NamingExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }执行后看到数据库的结果如下: 青阳子插进去了,非凡公子因为主键重复被甩了!下面我们再看加了JTA处理后的代码如下 UserTransactionuserTransaction=null; try{ Contextctx=newInitialContext(); DataSourceds1=(DataSource)ctx.lookup("java:/oracle1"); DataSourceds2=(DataSource)ctx.lookup("java:/oracle2"); userTransaction=(UserTransaction)ctx.lookup("UserTransaction"); Connectionconnection1=ds1.getConnection(); Connectionconnection2=ds2.getConnection(); userTransaction.begin(); Statementstatement1=connection1.createStatement(); Statementstatement2=connection2.createStatement(); Stringsql1="insertintojimmy_uservalues(4,'谈无欲')"; Stringsql2="insertintojimmy_uservalues(3,'傲笑红尘')"; intsun1=statement1.executeUpdate(sql1); intsun2=statement2.executeUpdate(sql2); statement1.close(); connection1.close(); statement2.close(); connection2.close(); }catch(NamingExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(NotSupportedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(SystemExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); try{ userTransaction.rollback(); }catch(IllegalStateExceptione1){ //TODOAuto-generatedcatchblock e1.printStackTrace(); }catch(SecurityExceptione1){ //TODOAuto-generatedcatchblock e1.printStackTrace(); }catch(SystemExceptione1){ //TODOAuto-generatedcatchblock e1.printStackTrace(); } }执行之后,“谈无欲”与“傲笑红尘”都没进入数据库,全局事务回滚了。4.XA 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 的全局事务中间件XA是分布式事务处理的规范,具体的实现是不同的数据库厂商自己实现的,mysql驱动目前不支持XA规范。 通常情况下,交易中间件与数据库通过XA接口规范,使用两阶段提交来完成一个全局事务,XA规范的基础是两阶段提交协议。在第一阶段,交易中间件请求所有相关数据库准备提交(预提交)各自的事务分支,以确认是否所有相关数据库都可以提交各自的事务分支。当某一数据库收到预提交后,如果可以提交属于自己的事务分支,则将自己在该事务分支中所做的操作固定记录下来,并给交易中间件一个同意提交的应答,此时数据库将不能再在该事务分支中加入任何操作,但此时数据库并没有真正提交该事务,数据库对共享资源的操作还未释放(处于上锁状态)。如果由于某种原因数据库无法提交属于自己的事务分支,它将回滚自己的所有操作,释放对共享资源上的锁,并返回给交易中间件失败应答。在第二阶段,交易中间件审查所有数据库返回的预提交结果,如所有数据库都可以提交,交易中间件将要求所有数据库做正式提交,这样该全局事务被提交。而如果有任一数据库预提交返回失败,交易中间件将要求所有其它数据库回滚其操作,这样该全局事务被回滚。以一个全局事务为例,AP首先通知交易中间件开始一个全局事务,交易中间件通过XA接口函数通知数据库开始事务,然后AP可以对数据库管理的资源进行操作,数据库系统记录事务对本地资源的所有操作。操作完成后交易中间件通过XA接口函数通知数据库操作完成。交易中间件负责记录AP操作过哪些数据库(事务分支)。AP根据情况通知交易中间件提交该全局事务,交易中间件会通过XA接口函数要求各个数据库做预提交,所有数据库返回成功后要求各个数据库做正式提交,此时一笔全局事务结束。XA规范对应用来说,最大好处在于事务的完整性由交易中间件和数据库通过XA接口控制,AP只需要关注与数据库的应用逻辑的处理,而无需过多关心事务的完整性,应用 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 开发会简化很多。具体来说,如果没有交易中间件,应用系统需要在程序内部直接通知数据库开始、结束和提交事务,当出现异常情况时必须由专门的程序对数据库进行反向操作才能完成回滚。如果是有很多事务分支的全局事务,回滚时情况将变得异常复杂。而使用XA接口,则全局事务的提交是由交易中间件控制,应用程序只需通知交易中间件提交或回滚事务,就可以控制整个事务(可能涉及多个异地的数据库)的全部提交或回滚。Jboss就好似这种XA中间件,用户只要在代码中显示的利用JTA接口开启、提交事务,调用预先配置好的XA数据源就可以了,底层如何做的对用户是透明的。Jboss为你做了这一切,尽管全局性事务执行速度上有些慢……5.事务的传播与隔离事务具有隔离性,并发程序发生的时候,一般有以下5种策略:1.没有任何隔离限制 connection1.setTransactionIsolation(Connection.TRANSACTION_NONE);2.可以读取未提交事务的数据,对方已经触发了相关业务(取了50块钱),但是食物还没提交到数据库中呢,您这边读到的数据已经是少了50块的数据。 connection1.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);3.获取的永远是提交后的值,这种保证独到的都是数据库的新值。也值通常采用的策略。 connection1.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);4.相对于第三种情况对于单表基本上可以满足事务需求,但是会导致读取2次,结果不相同的事情发生。单表中可以用下面策略解决 connection1.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);5.真正的可串行化的失误,不过效率最低,资源占用最多。 connection1.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);6.事务的传播性如果已经包含在一个事务中的程序想访问其他程序,那么此事务会不会影响另一段程序呢,就要看您的传播策略了有6种策略1.Required:共享型若1处在一个事务中调用了2,则2直接和1在同一个事务中。若1没有任何事务,则系统会默认给2创建一个新事务。此策略适合大多数情况。2.RequiredNew:独立型若1在一个事务中调用了2,则系统先将1的事务挂起,不管、之后为2设置一个新事务,执行完毕后恢复1的事务。若1没有事务,则会为2新开一个事务。3.Mandatory:强制共享型若1处在一个事务中调用了2,则2直接和1在同一个事务中。若1没有任何事务,直接抛出异常——TransactionRequiredException。4.NotSupported:无助独立型若1在一个事务中调用了2,则系统先将1的事务挂起,不管、之后2不开启任何事务,执行完毕后恢复1的事务。若1没有事务,2也直接执行。5.Supported:啃老型若1处在一个事务中调用了2,则2直接和1在同一个事务中。若1没有任何事务,直接执行2。6.Never:捣乱型若1处在一个事务中调用了2,则抛出RemoteException。若1没有任何事务,直接执行2也不会为它开启任何事务。7.EJB的事务管理EJB使用2种方式管理事务:1.CMT:容器管理——依靠应用服务器,声明式管理2.BMT:Bean自行管理——代码自己显示管理之后单独做笔记SessionBean时再详细讨论8.事务超时容器管理方式的可以通过容器进行配置,硬编码的可以通过显示代码注明。 userTransaction.setTransactionTimeout(20)7/7
本文档为【JavaEE5学习笔记01-JTA和数据库事务】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 已有0 人下载
最新资料
资料动态
专题动态
is_894033
暂无简介~
格式:doc
大小:82KB
软件:Word
页数:
分类:互联网
上传时间:2011-07-23
浏览量: