`

JavaEE 中的事务

阅读更多

1.资料

2.本地事务与分布式事务JOTM

  • 本地事务
    完全依赖于DB、JMS自身,,如直接调用jdbc中的conn.commit();这里没应用服务器什么事,所以也不支持多数据源的全局事务。
  • 分布式事务
    在JavaEE世界的事务在JTA、JTS规范和XA Sources之上实现。
    JTA是用户编程接口,JTS是服务器底层服务,两者一般由应用服务器自带实现,而 和JBoss Transaction是专门搞局抢生意的。
    XA Sources其实先于JavaEE而存在,JDBC driver必须有javax.sql.XADataSource接口的实现类,否则所谓二阶段提交就是个伪能力。
    JavaEE除了支持JDBC和JMS外,还引入了JCA模型。JCA可以说是目前唯一可移植的插入JavaEE事务的资源模型,因此像JDO这类框架/Server就是靠乖乖出自己的JCA连接器来参与JavaEE事务的。

3.编程式模型4.宣告式模型4.1 事务类型4.2 事务隔离级别4.3 关于Rollback4.4 关于Spring

    手工调用jdbc的connection事务方法和使用JTA接口都属于编程式开发,在EJB中叫BMT(Bean管理事务)。
    JTA最重要的接口就是UserTransaction和它的六个方法-begin,commit,rollback,getStatus,setRollbackonly,setTransactionTimeout。
    程序需要UserTransaction时可以从JNDI领取,不过JNDI名随应用服务器不同而不同。EJB3里可以直接用个@Resource注入。

    前面都是铺垫,这个才是主打的事务模型,如EJB的CMT(容器管理事务)和Sprin。

    其中EJB2.0,Spring1.0在部署描述符和applicationContext.xml中定义,而EJB3.0和Spring2.0则采用annotation。

     这里JavaEE与Spring的定义基本相同:

  • Required:如果Context中有事务就加入,没有就自己创建一个。(最常用设置)
  • Mandatory:永远加入一个事务。如果当前Context没有事务,抛出异常。(那些不打算自己负责rollback事务的方法,必须加入到别人的事务,由别人来控制rollback)
  • RequiresNew:永远新建一个事务。(那些不管别人如何,自己必须提交事务的方法,比如审计信息是一定要写的)
  • Supports:如果有事务就加入,如果没有就算了。永远不会创建新事务。(一般用于只读方法,不会主动创建事务,但如果当前有事务就加入,以读到事务中未提交的数据)
  • NotSupported:永远不使用事务,如果当前有事务,挂起事务。(那些有可能抛异常但异常并不影响全局的方法)
  • Never:不能在有当前事务的情况下调用本方法。(生人勿近?)

      可见,Required是默认的设置,Supports是只读方法的最佳选择。

  • ReadUncommited:本事务可以看到另一事务未提交的数据。脏读。
  • ReadCommited:本事务只可以看到另一事务已提交的数据。不可重复读。
  • RepeatableRead:可重复读。在一个事务内,第一次读到的数据,在本事务没有提交前,无论另一个事务如何提交数据,本事务读到的数据都是不变的。
  • Serializable:串行化,同时只有一个事务能读相同的数据。

    级别越低越安全效率也越低。隔离级别需要相关资源支持,如重复读在Oracle里会降级为ReadCommited。Spring里默认的Default级别完全看数据源的脸色行事。

    EJB里,想rollback只能sessionContext.setRollbackOnly(),或者抛出EJBException。(EJB3还可以annotation设置某些自定义Exception可以触发rollback)

    在Spring里,同样只会rollback unchecked exception(RuntimeExcption及子类),而checked exception(Exception及子类)是不会rollback的,除非你特别声明。

   @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW,rollbackFor = {MyException1.class,MyException2.class})

    因此所有在service层方法中用throws定义的Exception,都必须在事务定义中进行rollback设定。(请勿善忘)

    所有在service层方法中c被atch处理了的异常,又希望容器辅助rollback的话,必须重抛一个预定义的RuntimeException的子类。(请勿回望)

    Spring不希望编程式事务管理。
    Spring也不希望使用EJB CMT--CMT依赖于EJB而无法用于POJO,依赖于JTA全局事务对单数据源场景造成了浪费,而且rollback机制比较麻烦(必须为EJBException或手工setRollbackOnly())。
    因此Spring通过AOP实现了对POJO的整套宣告式事务体系;对jdbc,hibernate,jpa,jms等local数据源和JTA实现了统一的事务管理机制,而且支持本地资源与JTA在配置文件级的切换,而且改进了rollback机制。

   1)一个本地事务管理器:

<bean class="code-quote" id="&amp;lt;span"></bean>"transactionManager"
  class="org.springframework.orm.jpa.JpaTransactionManager">
  <property class="code-quote" name="&amp;lt;span">"entityManagerFactory" ref="entityManagerFactory" />
 </property>

   2)Spring就会把请求都转发到应用服务器的JTA对象上(注意此时数据源也需要改为用JNDI从应用服务器获取)。

<bean class="code-quote" id="&amp;lt;span"></bean>"myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>

   3)应用服务器专有的类型的JTA事务管理器:

<bean class="code-quote" id="&amp;lt;span"></bean>"myTxManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"/>

分享到:
评论
1 楼 Tian.Wang 2010-10-25  
隔 离 级 别
数据库的隔离级别(为了解决并发):
1. Read Unommited :未交先读。(使用很少)
2. Read Commited: 提交读 (大部分数据库都用此方式)
3. Repeatable Read: 可重复读
4. Serialiazble : 序列化读

脏读:未提交的数据,但是能看到数据。
存在不可重复读:在第一人读数据的同时 第2人修改了,刷新后第1人的数据跟原先不同。(未锁定的意思)
幻读:第1人在查看的同时 第2人录入记录,刷新后第一人能看到更多(未锁定)



读操作未提交(Read Uncommitted)完全没有事务隔离,最好不要采用。

可串行化(Serializable)是完全的事务隔离,不支持多事务并发,最好不要采用。



主要就是以下2种的选择:

读操作已提交(Read Committed)、 可重读(Repeatable Read)
这2种的主要区别在是否避免不可重复读,不可重复读的意思是:一个事务两次读同一行数据,可是这两次读到的数据不一样,就叫不可重读。如果一个事务在提交数据之前,另一个事务可以修改和删除这些数据,就会发生不可重读。
2位请根据自己接口的需要,增加不同的事务隔离级别,通过@Transactional的isolation属性配置事务隔离级别,如不需要可不配置isolation,isolation默认为采用数据库默认的事务隔离级别。

相关推荐

    JavaEE spring事务操作环境和基本功能搭建

    JavaEE spring事务操作环境和基本功能搭建

    JavaEE的Spring JDBC与事务管理 实验

    其操作流程是获取书的单价-&gt;买书(更新库存)-&gt;更新账户余额,在BookShopDaoImp中实现该方法,并使用基于XML和Annotation的声明式事务管理来确保该购书过程能正常执行(这时(1)中的方法都不需进行合法性判断,...

    JavaEE spring半自动bean管理事务案例

    JavaEE spring半自动bean管理事务案例

    基于JavaEE的学生会服务与事务管理系统.zip

    本资源是基于JavaEE的学生会服务与事务管理系统,可用于期末大作业的学习借鉴!

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

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

    实验 spring 声明事务

    Java高级编程 实验报告 spring 声明事务 实验目的 掌握spring 声明式事务管理配置 实验环境 本实验采用本实验采用的eclipse或者 Myeclpse开发工具。Spring 4.0以上 Jdk1.7以上、oracle/mysql。

    Spring JDBC与事务管理

    javaEE 实验三 Spring JDBC与事务管理, 一、实验目的 1、掌握Spring JDBC的配置; 2、掌握JdbcTemplae类中增删改查方法的使用; 3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握...

    千锋JavaEE精讲之Spring框架实战教程

    涉及IoC、DI、AOP、JdbcTemplate和事务管理等核心概念。同时讲解了xml和注解两种方式使用Spring的示例。  通过Spring的入门程序介绍了Spring的IoC和DI的概念,介绍了Spring的基本模块。详细介绍了对象创建的...

    JavaEE AOP源码

    在JavaEE中最常见的莫过于事务控制, 使得程序员只需关注核心业务逻辑,而无需关注事务相反非业务而又必须要的代码。 切面的主要组件有: 1、切面(@Aspect)。 2、切点(@Pointcut)、 3、通知方法(@Advise),...

    javaee jts规范中文版

    javaee jts规范中文版提供应用和应用服务器控制事务的范围和持续时间的能力 允许多个应用组件执行单个,原子事务的一部分工作 提供将全局事务与事务性资源执行的工作关联在一起的能力 协调跨多个资源管理器的全局事务...

    EJB与事务 -详细描述EJB和事务

    EJB与事务-详细描述EJB和事务,是javaEE初学者的好材料

    javaee-jdbc

    javaee-jdbc,jdbc 编程,事务控制和回滚

    JavaEE企业级开发的面试题汇总

    JavaEE企业级开发的面试题汇总,内容包含了: 1.Java基础:JAVASE面试题 2.框架试题:springmvc,spring,mybatis,springdata,springboot,springcolud等企业级开发中常见到的面试题 3.数据库:有关MYSQL数据库的面试题...

    基于SSM的班级事务管理系统 Javaee项目 ssm项目

    资源详情:https://blog.csdn.net/2302_78191516/article/details/136666525

    JavaEE-SSH-Template-master.zip

    javaEE+SSH框架模板项目 1. 测试Spring注解 测试注解 2. 测试自动建表 测试自动建表 3. 测试事务 测试事务 4. 测试分页 测试分页 ####其他信息

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    JavaEE_02_MySQL进阶.md

    JavaEE_02_MySQL进阶 1.表关系 拓展:权限经典5张表 2.多表查询【重点】 2.1 多表查询和迪卡尔积 2.2 多表查询语法 3.事务 3.1 事务简介 3.2 MySql的事务管理【理解】 3.3 事务特性和并发问题【重点】 1. ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    jOOQ-javaee-example:示例如何在 JavaEE 项目中使用 jOOQ

    jOOQ JavaEE 示例 此示例显示了 JavaEE 7 兼容应用服务器上 jOOQ 的基本配置(已使用 Wildfly 8.x 进行测试)。 该示例关注几个元素,在实现非基于 JPA 的“数据库处理”库时很方便 资源生产者 注释@javax....

    javaee7源码-javaee-spec:JavaEE平台规范

    平台规范还定义了平台的其他属性,例如安全性、部署、事务和互操作性。 API 规范 Java EE 平台的 API 规范集中在这里: 该页面包含指向所有 Java EE 规范的项目页面的链接。 (请务必在 中查看此页面,而不是在 ...

Global site tag (gtag.js) - Google Analytics