您好,欢迎访问三七文档
JTA2内容•事务的基本概念•J2EE事务处理•WLS事务管理事务的基本概念4事务的概念•事务的概念–事务是一种手段,可以保证一系列数据库操作能够准确地完成。–事务代表一个逻辑操作单位,或者其中的所有操作都成功,或者都不执行5ACID•Atomic(原子性)–组成事务的操作必须都成功、或者根本都不执行•Consistent(一致性)–在操作过程中不会破坏数据的完整性•Isolated(隔离性)–隔离性意味着事务正在处理过程中,在事务外面无法看到事务处理的中间结果•Durable(持久性)–事务的各个操作结果必须持久存储6J2EE中事务的参考者•J2EE中事务的参考者可以是–JDBCConnections–JMSConnections–EJBAccesses7本地事务和分布式事务•本地事务–限定在一个资源•分布式事务:–跨越多个资源,包括不同类型的资源8两阶段提交协议和XA接口•两阶段提交用于控制分布式事务的协议。在一个事务过程中,它指定一系列事务管理器和资源管理器间的状态和命令•WebLogic事务管理器使用OpenGroup的XA接口来实现两阶段提交J2EE事务处理10WebLogic中事务方式的选择•在JDBC连接中直接声明事务的方式–只限于在比较简单的应用中使用•JTA–让JMS和EJB参考事务的唯一选择是采用JTA11处理多个访问相同数据的用户,可能出现的问题•脏读–发生在当一个事务提交前,允许其他事务读取受这一事务影响的数据•不可重复的读–发生在当一个事务试图两次选择同一行,但第二个事务已在期间修改或删除了这一行时•错误读取–发生在当一个事务读取了满足条件的所有行,但是随后第二个事务插入了一个满足同样条件的新行时,如果第一个事务重新读取这些行,在结果中就会出现新的错误行12java.sql.Connection接口定义的隔离级别•TRANSACTION_NONE说明不支持事务•TRANSACTION_READ_UNCOMMITTED说明在提交前一个事务可以看到另一个事务的变化。这样脏读、不可重复的读和虚读都是允许的。•TRANSACTION_READ_COMMITTED说明读取未提交的数据是不允许的。这个级别仍然允许不可重复的读和虚读产生。•TRANSACTION_REPEATABLE_READ说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。•TRANSACTION_SERIALIZABLE是最高的事务级别,它防止脏读、不可重复的读和虚读。13事务的隔离级别•在J2EE中,通过java.sql.Connection接口设置事务隔离级别,这一接口为连接的隔离级别提供了getter()和setter()–intgetTransactionIsolation()throwsSQLException–voidsetTransactionIsolation()throwsSQLException•Connection对象负责事务,一旦收到事务请求,事务将自动提交,因为Connection对象已定义为自动提交方式,可通过setAutoCommit(false)禁用自动提交模式•另外java.sql.DatabaseMetaData接口为数据存储提供支持的隔离级别查找方法:getTransactionIsolation(),supportsTransactionIsolationLevel()•对多个库操作的分布式事务必须在所有库中执行同一个隔离级别,否则会出现意想不到的结果14WebLogicJTS•WebLogicJTS支持本地事务跨过一个或多个服务器端,使用javax.Transaction.UserTransaction接口控制事务•UserTransaction类可以控制事务并发线程的执行•使用JTS编程,要确保参与到事务中的所有代码在同一线程中执行并从同一个连接池请求连接15事务的界定•事务界定是指一个事务何时开始、挂起、重新开始、提交和回滚的程序•在J2EE中,事务可在代码中调用JTA手工界定,也可以在部署描述符中声明规则自动界定•自动界定事务称为容器管理事务并对EJB有效•Servlet、RMI程序和JavaBean必须通过使用JTA手工界定事务•在会话Bean和消息Bean中可手工也可自动界定事务,但在EJB2.0中实体Bean必须使用容器管理事务16EJB容器管理事务界定•NotSupported:不管调用者是否事务性的,相应的EJB调用都不能参与事务,用于不支持事务的EJB方法•Required:如果调用者有一个事务,相应的EJB可以参与该事务,否则,容器将在调用相应的EJB方法之前,开始一个事务•Supports:如果调用者正在参与事务,相应的EJB调用也可以参与事务,在NotSupported和Required之间•RequiresNew:在调用相应EJB方法之前,容器先开始一个新的事务,当方法调用返回时即提交这个事务•Mandatory:如果调用者有一个事务,相应的EJB必须参与该事务•Never:相应的EJB调用不参与事务17在会话Bean中使用事务•EJB容器可以利用JTA,提供事务支持•在会话Bean中,可以有两种可能的事务:Bean管理的事务和容器管理的事务•ejb-jar.xml中的transaction-typeBean/transaction-type标记符表示使用Bean管理的事务.•ejb-jar.xml中的transaction-typeContainer/transaction-type标记符表示使用容器管理的事务。容器管理的事务省去了自己编写代码表示事务的开始或提交。18在会话Bean中使用容器管理的事务•容器管理的事务需要在ejb-jar.xml中声明事务的属性,容器将读取这些属性,并按照要求自动开始或提交事务{container-transactionmethodejb-namestatelessSession/ejb-namemethod-name*/method-name/methodtrans-attributeRequired/trans-attribute/container-transaction}19SessionSynchronization接口•在容器管理事务的情况下,有状态会话Bean可以有选择地实现javax.ejb.SessionSynchronization接口–publicvoidafterBegin():通知Bean一个新的事务启动–publicvoidbeforeCompletion():通知Bean事务将要被提交–publicvoidafterCompletioin():通知Bean事务已经完成20处理事务的步骤21JTA事务处理例子WLS事务管理23监控事务24事务的日志•当资源管理器失败或者事务超时,可以监控事务日志来得到信息。•当移植到新的机器,这些日志文件必须被移植。25JTA日志文件写入策略26JTA日志文件写入策略•日志文件写入策略仅有两种:•Cache-Flush•Disk-Write•默认为Cache-Flush•推荐设置:Disk-Write•Disk-WriteforSolaris•OnWindows,useDisk-Writeonlyiftheon-diskcacheisdisabledortheon-diskcacheishighlyreliable.27恢复失败的事务•TheTMattemptstoresolvepreparedtransactions,eventaftermultiplecrashes•TM使用TRS(TransactionRecoveryService):–系统启动时,自动尝试去恢复事务–每个Server都有transactionlog–启动时会解析所有的log,找到未决事务并完成它•BEArecommendsthatyouattempttorestartacrashedserver,andlettheTRShandleincompletetransactions
本文标题:1.11 JTA
链接地址:https://www.777doc.com/doc-5516596 .html