spring事务学习笔记

事务  E:\HNHJ\java13\ibatis_template\doc\iBatis 学习笔记\IBATIS学习笔记(3) SQL Map XML配置文件 - 有时候,桔色的灯光下,一杯清茶,我们能分享很多! - 博客园.mht

  1. JDBC,通过传统JDBC Connection commit/rollback实现事务支持。
  2. JTA,使用容器提供的JTA服务实现事务管理
  3. EXTERNAL,外部事务管理,如在EJB中使用ibatis,通过EJB部署配置即可实现自动的事务管理机制,此时ibatis将把所有的事务委托给外部容器进行管理,此外,通过Spring等轻量级容器实现事务的配置化管理也是一个不错的选择。

 

声明式事务。

编程式事务。

 

Spring注解方式

Log4j,commons-logging

<context:component-scan />  注解方便之处。

注解配置生效:org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping 默认实现,可以不写,Spring容器默认会使用该类。

Org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 直接关系到多动作控制器配置是否可用!

 

序列化优点:对象需要进行网络传输,本地缓存,建议实现序列化接口。Serializable

 

Service注入

@Service

@Transactional

Public class AccountServiceImpl …{

       @Autowired

       Private AccountDao accountDao;

}

Dao注入

@Repository

Public class AccountDaoImpl …{

 

}

 

Spring声明式事务

TransactionTemplate template = new TransactionTemplate(transactionManager);

template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);

template.execute(new TransactionCallbackWithoutResult(){

       protected void doInTransactionWithoutResult(TransactionStatus status){

              testDao.save(obj);

}

});

 

 

//获取事务管理器

PlatformTransactionManager txManager = (PlatformTransactionManager)ctx.getBean("

txManager");

//定义事务管理的模板

TransactionTemplate transactionTemplate = new TransactionTemplate(txManager);

//定义事务属性

transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);

//回调,执行真正的数据库操作,如果需要返回值需要在回调里返回

transactionTemplate.execute(new TransactionCallback(){

       public Object doInTransaction(){

              //执行数据库操作

              System.out.println(jdbcTemplate.queryForInt("select count(*) from tbl_doc"));

              return null;

       }

});

 

 

 

 

之前项目中应用的事务框架写法:

  1. 定义事务管理器bean <transactionManager> 关联dataSource
  2. 定义事务代理模板bean txProxyTemplate  关联三个部分:

1.transactionManager,

2.transactionAttributes (modify* ,PROPAGATION_REQUIRED, readOnly),

3.service bean关联,

<bean id="userService" parent="txProyTemplate">

<property name="target">

<bean class="xx.xx.UserServiceImpl">

<property name="userDao" ref="userDao"/>

</bean>

</property>

</bean>

 

事务测试情形一

Web层捕获异常并处理,DAO层不捕获异常,Service也不捕获异常。 èspring事务管理成功(封装DataAccessException异常逐层抛出)

事务测试情形二

Web捕获异常并处理,Service捕获异常并处理,DAO层不捕获异常。èService捕获异常并不向外抛出,web层捕获不到异常,Spring事务管理失败。

事务测试情形三

Web层捕获异常,Service捕获异常,DAO层也捕获异常。 èDAO层捕获异常,其他捕获不到,Spring事务管理失败。

 

 

事务基础

ACID特征

隔离级别

ISOLATION_DEFAULT: 默认隔离级别,即使用底层数据库默认的隔离级别。

ISOLATION_READ_UNCOMMITTED: 未提交读(未授权读取)

ISOLATION_READ_COMMITTED: 提交读,一般情况下我们使用这个(授权读取)

ISOLATION_REPEATABLE_READ: 可重复读

ISOLATION_SERIALIZABLE: 序列化

传播行为(7种)

1.Required:必须有逻辑事务。表示如果当前存在一个逻辑事务,则加入该逻辑事务,否则将新建一个逻辑事务。PROPAGATION_REQUIRED指定。

 

因此userService对象的save方法和addressService的save方法属于同一个物理事务,如果发生回滚,则两者都回滚。

2.RequiresNew:创建新的逻辑事务。PROPAGATION_REQUIRES_NEW指定。

 

userService对象的save方法和addressService对象的save方法不属于同一个逻辑事务也不属于同一个物理事务。

3.Supports支持当前事务,使用PROPAGATION_SUPPORTS指定。如果当前存在逻辑事务,就加入到该逻辑事务,否则以非事务方式执行。

 

4.NotSupported:不支持事务。使用PROPAGATION_NOT_SUPPORTED指定。

 

5.Mandatory:必须有事务,否则抛出异常,使用PROPAGATION_MANDATORY指定,使用当前事务执行,如果当前没有事务,则抛出iIllegalTransactionStateException

 

6.Never:不支持事务,如果当前存在事务则抛出异常,使用PROPAGATION_NEVER指定,即以非事务方式执行,如果当前存在事务,则抛出异常illegalTransactionStateException

 

7.Nested:嵌套事务支持。使用PROPAGATION_NESTED指定。如果当前存在事务,则在嵌套事务内执行,如果当前不存在事务,则创建一个新的事务,嵌套事务使用数据库中的保存点来实现,即嵌套事务回滚不影响外部事务,但外部事务回滚将导致嵌套事务回滚。

 

事务超时, setTimeout(100)

事务只读,将事务标示为只读,只读事务不修改任何数据。

汇总:

除了REQUIRED事务,spring中还有以下事务
       PROPAGATION_MANDATORY: 方法必须在一个现存的事务中进行,否则丢出异常
       PROPAGATION_NESTED: 在一个嵌入的事务中进行
       PROPAGATION_NEVER: 不应在事务中进行,如果有则丢异常
       PROPAGATION_NOT_SUPPORTED: 不应再事务中进行,如果有就暂停现存的事务
       PROPAGATION_REQUIRED: 支持现在的事务,如果没有就建立一个新的事务
       PROPAGATION_REQUIRES_NEW: 建立一个新的事务,如果现存一个事务就暂停它
       PROPAGATION_SUPPORTS: 支持现在的事务,如果没有就以非事务的方式执行

--http://dannyfk221.iteye.com/blog/1692271—

 

MySQL相关

要使用MySQL数据库进行事务处理,必须建立支持事务的表格类型,例如InnoDB的表格类型。

Create table user(

 Id  int(11)  not null auto_increment primary key,

 Name  varchar(100)  not null  default ' ';

 Age int

)type = InnoDB;

posted @ 2013-05-04 20:03  全新时代-小小程序员大梦想  阅读(534)  评论(0编辑  收藏  举报