Java中有三种可以的事务模式
1、本地事务模型
事实上不是编程框架本身来管理事务,事务是交给本地资源管
理器(local resource manager)来管理的
2、编程式事务模型
利用了 Java 事务 API(Java Transaction API, JTA)及其底层事务服务实现的
能量以提供事务支持,突破了本地事务模型的种种限制。通过编程式事务模型,开发人员
的编码对象是“事务”,而非连接。
3、申明式事务模式
在声明式事务模型的环境下,软件框架
或“容器”管理了事务的开始和结束(或者提交,或者回滚)。开发人员仅仅需要告诉软件框6
架,碰到应用异常时“去回滚事务”即可,对事务的配置都是通过 EJB 中的 XML 部署描述文件
(例如 ejb-jar.xml)或 Spring 中的 bean 定义文件(例如 ApplicationContext.xml)来完成的。
事务的特性: 原子性 一致性 独立性 持久性 (ACID)
JTA java 事务Api
UserTransaction接口仅仅用于编程式事务模型,而且主要在 EJB 中使用
常用方法
begin()
在编程式事务模型中,begin()方法用于开启一个新的事务,并且将此事务与当前线程相关联。
如果某个事务已经与当前线程建立过关联,并且底层事务服务不支持嵌套事务,该方法会抛
出一个 NotSupportedException 异常
commit()
在编程式事务模型中,commit()方法用于提交和当前线程关联的事务,并且终止该事务。这
个方法同时将此事务与当前线程解关联。在 Java 中,仅仅有一个事务能够与当前线程建立
关联。在 XA 环境下,这个方法可能抛出 HeuristicMixedException 或 HeuristicRollbackException,
表示资源管理器做出了独立于事务管理器的决定,在两阶段提交过程中回滚或者部分提交了
该事务。
rollback()
在编程式事务模型中,rollback()
方法用于回滚和当前线程关联的事务,并终止该事务。 这个
方法同时将此事务与当前线程解关联。
getStatus()
在编程式事务模型中,getStatus()方法返回一个整型数值,用以表示当前事务的状态。这个
整型返回值初看是没有什么意义的,不过我们可以使用 javax.transaction.Status 接口来确定
getStatus()方法返回的值是什么含义。
TransactionManager接口 主要用于声明式事务模型
suspend()暂停
resume() 继续
EJBContext 接口
setRollbackOnly() 通知容器
Status接口 我们能够通过 javax.transaction.Status 接口枚举值获取到事务的状态
包括的一些枚举值
- STATUS_ACTIVE 是否有事务存在
- STATUS_COMMITTED
- STATUS_COMMITTING
- STATUS_MARKED_ROLLBACK 是否被标记回滚
- STATUS_NO_TRANSACTION 确定是否真的没有事务上下文的唯一途径
- STATUS_PREPARED
- STATUS_PREPARING
- STATUS_ROLLEDBACK
- STATUS_ROLLING_BACK
- STATUS_UNKNOWN
本地事务模型
事务被底层数据库(DBMS)或在 JMS 中被底层
消息服务提供者所管理。从开发人员的角度来看,在本地事务模型中,我们所管理的并非“事
务”,而是“连接”。
编程式事务模型
编程式事务模型和本地事务模型两者最大区别之一是,开发人员使用编程式模型,管理的是
事务(transaction),而不是连接(connection)。编程式事务模型也可用在 servlet 容器之中,能应用于 POJO