您的位置:首页 > 编程语言 > Java开发

spring 事务的两种用法

2017-09-27 18:06 357 查看
spring事务两种使用方法

1.@Transactional 注解

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'等等。
propagationREQUIRED事务传播行为
isolationDEFAULT事务隔离级别
timeout-1事务超时的时间(以秒为单位)
read-onlyfalse事务是否只读?
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包。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: