EJB事物 笔记

一、事务的基本知识

1、什么是事务?

通常,我们把一组连续不可分的数据库操作称为一个事务。

事务解决了两大问题,原子操作,数据共享

原子操作,是由不可分操作组成的,使这些不可分的操作,一同操作成功或者一同失败。

2、事务的ACID特性

A(Atomicity)原子性:操作不可分割,一连串操作当作一个整体执行;

C(Consistency)一致性:数据库的数据在事务完成前后保持一致;

I(insulation)隔离性:多个事务独立地执行,一个事务的执行不影响另一个事务的执行结果,隔离性即一个事务对另一个事务的可见性;

D(durability)持久性:事务操作的结果应该保留下来。

3、事务的类型

(1)扁平式事务:事务要么成功,要么失败,不允许包含子事务;

(2)嵌套式事务:一个大事务里潜逃多个小事务,允许子事务回滚。各个子事务必须都成功,整个事务才能成功提交;

Tips:EJB不支持嵌套式事务。

4、分布式事务(DistributedTransaction)

(1)什么是分布式事务?

跨越多个数据资源的事务叫做分布式事务。

数据资源:对数据进行存储、管理的空间(如Database,JMS中的主题队列,FileSystem,后端系统等)。

JDBC只支持本地事务。

本地事务:只负责处理单个数据资源(DataResource)的事务。

(2)为什么要使用分布式事务?

企业级应用中,业务需要跨越多个数据资源,并且要作为一个整体来执行,就需要使用分布式事务。

(3)分布式事务的原理

两阶段提交协议(Two-phrasecommitprotocol)

①四个角色:A、DataResource(数据存取的目的地,通常为Database)

B、ResourceManager(负责数据资源管理,通常为Databasedevice)

C、TransactionManager(负责对资源管理器施加事务的管理)

D、TransactionCoordinator(事务协调器,负责对多个事务管理器进行协调,保证分布式事务能够执行)

②Two-phrasecommitprotocol执行过程(类似于投票机制中的一票否决制)

第一阶段:事务准备阶段

a、事务协调器(TransactionCoordinator)向各个事务管理器(TransactionManager)发送事务准备提交的信息;

b、TransactionManager向TransactionCoordinator回应是否提交事务;

c、TransactionCoordinator记录日志(各个TransactionManager的回应);

第二阶段:事务提交阶段

d、TransactionCoordinator向各个TransactionManager发送事务提交信息;

e、TransactionManager将执行结果返回给TransactionCoordinator。

二、EJB中的事务机制

1、JTS(JavaTransactionService)

JTS协议基于OTS协议,JTS协议即Java中分布式事务服务的协议。

JTA(JavaTransactionAPI):

①UserTransaction(EJB或其他组件用该接口使用分布式事务)

②TrasactionManager:应用服务器与分布式事务服务器的接口

③ResourceManager

EJB事务调用流程:EJB→UserTransaction→JTA→JTS→OTS

2、EJB的事务

①EJB事务的特点

提供声明式事务与编程式事务

声明式事务:应用程序只需要关心业务逻辑,由容器来负责事务的管理。

编程时事务:应用程序编码人员自己写事务代码。

②EJB事务编程的类型

A、CMT容器管理事务

B、BMTBean管理事务

C、Client-MTClient-ControlledTransaction客户端管理事务

实体Bean只能用CMT。

CMT:

由容器实现的远程对象/拦截器,负责调用中间件服务。

优点:在应用程序代码中,不用编写事务服务代码;

缺点:粗粒度,只能在方法级别控制事务。

EJBBean类中编程方式来使用事务(BMT):

优点:细粒度地控制事务

缺点:事务代理与业务代码纠缠

Client-controlledTransaction:

优点:客户端可以精确控制事务

缺点:可能会因为网络问题引起是事务的回滚。

3、EJB事务边界的划分

事务边界:事务边界是指事务从哪里开始。

CMT的事务特性:

Required:Bean类的方法必须要在事务环境下运行,这是容器默认的事务机制。

事务特性只能使用在CMT。

RequiredNew:Bean类中的方法必须在一个新的事务环境下运行。

Supports:Bean类的方法不需要支持事务。如果客户端有事务,则继续沿用原事务环境。

Mandatory:Bean类中方法必须要在事务环境下运行。客户端不启动事务则报错。

NoSupported:Bean类中方法不支持事务。如果客户端启动了事务,则挂起该事务。

Never:Bean类中的方法不支持事务。如果客户端启动了事务,则报错。

三、EJB事务的编程

1、CMT

@TransationManagement用在类前,标注该EJB事务管理方式为Bean|Container(默认)

@TrasactionAttribute用在方法前,标注事务特性(事务的边界)

@SessionContext.setRollbackOnly()回滚标识,setRollbackOnly()方法必须在事务环境下运行。

EJB容器对于非受查异常(主要指RuntimeException)会回滚,事务对于受查异常则会提交事务。

2、BMT

UserTransaction:

①interface

②提供控制事务的方法

③由容器实现,可以使用@Resource注入

UserTransaction.begin()|commit()|.rollback()

3、客户端控制事务

调用EJB的方法,要求EJB必须采用CMT形式。

4、事务的隔离性

事务的隔离级别:

A、Readuncommitted:性能最高

B、Readcommitted:解决脏读问题

C、Repeatableread:解决重复读取问题

D、Serializable:解决幻读问题

EJB本身不提供隔离级别的设置,可以通过直接设置数据库(连接池)的隔离级别。

SessionSynchronization接口:

在有状态会话Bean中,如果事务失败,可以恢复其状态。

afterbegin():在事务刚启动是,容器调用该方法,一般做状态初始值的保存。

beforeCompletion():在事务完成之前,容器回调。

afterCompletion():在事务提交之后调用,boolean值由容器提供。true表示事务提交成功,false则表示事务失败。在此方法中,做状态的恢复。

相关推荐