锁定老帖子 主题:2 Spring2.0用注解实现事务管理
精华帖 (4) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2009-02-13
最后修改:2009-03-08
Spring2.0框架的事务处理有两大类: 1 编码式事务 , 这个不说. 2 声明式事务 , 就说这个.
声明式事务又有三种实现方法: 1 (第一种) 最早的方法,用TransactionProxyFactoryBean,他是一个有AOP代理功能的FactoryBean.他返回的对象有事务. 还要在spring的配置文件XML中配置,比较麻烦,不详细说. <!-- 事务测试DAO --> <bean id="go_TestPOAO" class="pic.dao.transaction_test.TestPOAOImpl" parent="go_POAOBase"></bean> <!-- 事务测试DAO 声明式事务管理 --> <bean id="go_TestPOAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="proxyInterfaces"> <list> <value>pic.dao.transaction_test.TestPOAO</value> </list> </property> <property name="target" ref="go_TestPOAO"/> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> 2 (第二种) 使用<tx:>来实现声明式事务 ,也要在spring的配置文件XML中配置,比较麻烦,不详细说. <tx:advice id=""> ..... </tx:advice> <aop:config> ..... </aop:config>
3 (第三种) 这个方法方便,使用注解来实现声明式事务, 下面详细说说这个方法:
第一步:引入<tx:>命名空间 ,在spring的配置文件中修改, beans根元素里多了三行,如下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
第二步:在spring的配置文件中修改,将所有具有@Transactional 注解的bean自动配置为声明式事务支持 <!--JDBC事务管理器,根据你的情况使用不同的事务管理器,如果工程中有Hibernate,就用Hibernate的事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref local="dataSource"/> </property> </bean> <!-- 用注解来实现事务管理 --> <tx:annotation-driven transaction-manager="transactionManager"/>
第三步: 在接口或类的声明处 ,写一个@Transactional. 要是只的接口上写, 接口的实现类就会继承下来. 接口的实现类的具体方法,还可以覆盖类声明处的设置. @Transactional public class TestPOAOImpl extends POAOBase implements TestPOAO { @Transactional(isolation = Isolation.READ_COMMITTED) public void test1() { String sql = "INSERT INTO sy_test (NAME,AGE) VALUES('注解赵云',30)"; execute(sql); sql = "INSERT INTO sy_test (NAME,AGE) VALUES('注解张飞',26)"; execute(sql); int a = 9 / 0; //异常 sql = "INSERT INTO sy_test (NAME,AGE) VALUES('注解关羽',33)"; execute(sql); System.out.println("走完了"); } //execute() 方法略... }
注意的几点: 1 @Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.
2 默认情况下,一个有事务方法, 遇到RuntiomeException 时会回滚 . 遇到 受检查的异常 是不会回滚 的. 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) .
@Transactional 的所有可选属性如下:
事务的隔离级别 有如下可选: 可以去看spring源码 : org.springframework.transaction.annotation.Isolation 我的"隔离级别"相关文章 有不明白的,可以去看看.
事务的传播属性 ,有如下可选 可以去看spring源码 : org.springframework.transaction.annotation.Propagation
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2009-02-15
讲得不错,赞一个
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2009-02-15
学习了,比较灵活,不过还是觉得第二种方法来得方便。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2009-02-19
引用 第三步: 在接口或类的声明处 ,写一个@Transactional. 要是只的接口上写, 接口的实现类就会继承下来.
接口的实现类的具体方法,还可以覆盖类声明处的设置. 接口的注解不能继承吧? |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2009-02-19
最后修改:2009-02-19
locka 写道 引用 第三步: 在接口或类的声明处 ,写一个@Transactional. 要是只的接口上写, 接口的实现类就会继承下来.
接口的实现类的具体方法,还可以覆盖类声明处的设置. 接口的注解不能继承吧? 使用spring的AOP, @Transactional写在接口上或是写在实现类上,都行,都能识别. 使用CGLIB的AOP, 就只能写实现类上了. 我想大家,大多数,使用的都是spring自带的AOP吧, 要不, 为了保险, 就把注解写有实现类上吧. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2009-03-18
我用的也是第二种方法,还不错。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2009-03-20
第二、三种方法一起用如何?tx里面定义get、find方法是只读事务,其它需commit、rollback
而在注解里面只需要定义@service、@Autowire之类的 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2009-04-01
感觉第三种要写注入不是很方便。但是bean的注解注入还是很方便的。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2009-09-05
顶!原来注解也可以继承了,好像还有一种比较麻烦的编程式事务...
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
浏览 11598 次