spring事务两种使用方法
[email protected] 注解
2.AOP 配置 xml (需要依赖包:aopalliance-1.0.jar/ aspectjweaver-1.8.8.jar / spring-aspects-4.2.5.RELEASE.jar)
重要说明: spring-aspects-4.2.5.jar 与 aspectjweaver-1.8.8.jar 是版本匹配的。如果版本不正确会报错误:
java.lang.IllegalStateException: Expected raw type form of org.springframework.w…..
示例代码
第一种方式 @Transactional
springmvc-servlet.xml 增加下面代码
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean><!--开启注解事务--> <tx:annotation-driven transaction-manager="transactionManager" />
service层使用
public void MyService(){ @Transactional public void test() { Person psn = new Person(); psn.setId(1); psn.setName("aaaaaaa"); Person psn2 = new Person(); psn2.setId(1); psn2.setName("bbbbbb"); Person psn3 = new Person(); psn3.setId(3); psn3.setName("cccccc"); personDao.insert(psn); personDao.insert(psn2); personDao.insert(psn3); } }
说明:在处理@Transactional标签的时候,若在同一个类中无论遇到多少个事务,都会当成一个事务处理
第二种 aop配置
引入依赖jar包 aopalliance-1.0.jar/ aspectjweaver-1.8.8.jar / spring-aspects-4.2.5.RELEASE.jar
springmvc-servlet.xml 增加下面代码
<!-- ***************事务配置************** --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 定义AOP配置 --> <aop:config> <!-- 将advice和pointcut结合 --> <aop:advisor pointcut="execution(* com.seentao.jxgl.service.*.insert*(..))" advice-ref="txAdvice" /> </aop:config> <!-- 定义哪些方法需要执行事务 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" read-only="true" propagation="SUPPORTS" /> <tx:method name="*" propagation="REQUIRED" rollback-for="Exception" /> </tx:attributes> </tx:advice>
aop:advisor说明:
表示com.xy.service包下的所有方法为为事务管理。
execution(* com.aptech.jb.epet.dao.hibimpl.*.*(..))
这样写应该就可以了 这是com.aptech.jb.epet.dao.hibimpl 包下所有的类的所有方法。。
第一个*代表所有的返回值类型
第二个*代表所有的类
第三个*代表类所有方法 最后一个..代表所有的参数。
下面给出一些常见切入点表达式的例子:
任意公共方法的执行:
execution(public * *(..))
任何一个以“set”开始的方法的执行:
execution(* set*(..))
AccountService 接口的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
定义在service包里的任意方法的执行:
execution(* com.xyz.service.*.*(..))
定义在service包或者子包里的任意类的任意方法的执行:
execution(* com.xyz.service..*.*(..))
tx:advice 说明:
<tx:advice id="defaultTxAdvice">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<tx:advice/>
任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚(如果抛出自定义异常,请继承RuntimeException类 成为RuntimeException)
(
Java包含两种异常:checked异常和unchecked异常。C#只有unchecked异常。checked和unchecked异常之间的区别是:
Checked异常必须被显式地捕获或者传递,如Basic try-catch-finally Exception Handling一文中所说。而unchecked异常则可以不必捕获或抛出。
Checked异常继承java.lang.Exception类。Unchecked异常继承自java.lang.RuntimeException类
非运行时异常(Checked Exception)
Java中凡是继承自Exception但不是继承自RuntimeException的类都是非运行时异常。
运行时异常(Runtime Exception/Unchecked Exception)
RuntimeException类直接继承自Exception类,称为运行时异常。Java中所有的运行时异常都直接或间接的继承自RuntimeException。
3、Java中所有的异常类都直接或间接的继承自Exception。
4、spring事务回滚机制只处理运行时异常,发生非运行时异常则不会回滚操作
可参考:http://blog.csdn.net/javaloveiphone/article/details/52607396
)
<tx:advice/> 和 <tx:attributes/> 标签里的 <tx:method/> 各种属性设置总结如下:
属性 | 是否需要? | 默认值 | 描述 |
---|---|---|---|
name | 是 | 与事务属性关联的方法名。通配符(*)可以用来指定一批关联到相同的事务属性的方法。 如:‘get*‘、‘handle*‘、‘on*Event‘等等。 | |
propagation | 不 | REQUIRED | 事务传播行为 |
isolation | 不 | DEFAULT | 事务隔离级别 |
timeout | 不 | -1 | 事务超时的时间(以秒为单位) |
read-only | 不 | false | 事务是否只读? |
rollback-for | 不 | 将被触发进行回滚的 Exception(s);以逗号分开。 如:‘com.foo.MyBusinessException,ServletException‘ | |
no-rollback-for | 不 | 不 | 被触发进行回滚的 Exception(s);以逗号分开。 如:‘com.foo.MyBusinessException,ServletException‘ |
tx:advice 标签来指定不同的事务性设置。默认的 <tx:advice/> 设置如下:
事务传播设置是 REQUIRED
隔离级别是 DEFAULT
事务是 读/写
事务超时默认是依赖于事务系统的,或者事务超时没有被支持。
点击下载代码 请自行补充spring4.2.5.jar包。