Just a little smile ^ ^

yoyo_zeng

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在程序行下文中声明一个事务管理器

jdbc事务管理器

DataSourceTransactionManager通过datasource检索到java.sql.Connection 对象来管理事务,一个成功的事务调用当前连接commit()提交,一个失败的事务通过rollbck()回滚

<bean id="transactionManager" class="org.springframework.jdbc.
datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/>
</bean>

 

jpa事务管理器

<bean id="transactionManager"
      class="org.springframework.orm.jpa.JpaTransactionManager">
  <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

 

jto事务管理器

<bean id="transactionManager" class="org.springframework.
transaction.jta.JtaTransactionManager"> <property name="transactionManagerName" value="java:/TransactionManager" />
</bean>

 

程序中使用事务管理器

public void saveSpittle(final Spittle spittle) {
  transactionTemplate.execute(new TransactionCallback<Void>() { //使用transctiontemplate,必须实现transactioncallback接口,该接口中只有一个function
    public Void doInTransaction(TransactionStatus txStatus) {
      try {
      spitterDao.saveSpittle(spittle);
      } catch (RuntimeException e) {
        txStatus.setRollbackOnly(); //回滚
throw e; }
      return null;
    }
}); }

 

声明式事务

来源百度百科:声明式事务(Programmatic transaction management)是Spring提供的对程序事务管理的方式之一。

   Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中申明。用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可;在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。

  Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为单位,Spring的事务属性自然就在于描述事务应用至方法上的策略,在Spring中事务属性有以下四个参数:

1.传播行为

2.隔离级别

脏读: a事务写数据但未提交,b事务读取,a事务回滚,b读取的数据无效

不可重复读:a事务读取两次数据结果不同,可能另一并发事务在两次查询中改写数据

幻读取:事务在查询多条记录的过程中,数据被改写。

隔离级别:

SOLATION_DEFAULT 默认级别
ISOLATION_READ_UNCOMMITTED 允许读取尚未更改的数据,级别最低
ISOLATION_READ_COMMITTED 允许从已提交的并发事务中读取数据,可防止脏读,不可防止不可重复读和幻读
ISOLATION_REPEATABLE_READ 对相同字段的多次读取结果一致,不可防止幻读
ISOLATION_SERIALIZABLE 完全锁定当前事务涉及的table,级别最高,但是最慢

3.只读提示 

如果事务只读取数据,数据库可优化,由后端数据库实施

4.事务超时期间

5. 回滚规则

定义哪些异常可引起回滚

 

声明事务

1 在spring2.0中声明事务

<tx:advice id="txAdvice" transaction-manager="txManager"> //使用tx命名空间
  <tx:attributes>
    <tx:method name="add*" propagation="REQUIRED" />
    <tx:method name="*" propagation="SUPPORTS"
        read-only="true"/>
  </tx:attributes>
</tx:advice>
<aop:config> //通知器,定义接受通知的bean
  <aop:advisor
      pointcut="execution(* *..SpitterService.*(..))"//实现spitterservice的所有的接口的bean
      advice-ref="txAdvice"/> 
</aop:config>

The five facets of the transaction pentagon are specified in the attributes of the <tx:method> element.

propagation 事务的传播规则isolation 事务的隔离级别

read-only 是否为只读

rollback-for 那该异常应该回滚

no-rollback-for 对于哪些异常当前事务应该继续执行而不回滚

timeout 事务超时时间

 

2 通过注解声明事务

在应用程序上下文中加入

<tx:annotation-driven transaction-manager="txManager" />

该注释告诉spring在类层或者方法层检查程序上下文的所有bean,寻找标注@transactional的bean,tx:annotation-driven 将自动把事务通知的内容给他

可注释在一个类上或一个接口或一个方法上

   @Transactional(propagation=Propagation.SUPPORTS, readOnly=true)
        public class SpitterServiceImpl implements SpitterService {
        ...
          @Transactional(propagation=Propagation.REQUIRED, readOnly=false)
          public void addSpitter(Spitter spitter) {
        ...
} ...
}

 

posted on 2012-11-19 22:43  yoyo_zeng  阅读(430)  评论(0编辑  收藏  举报