码迷,mamicode.com
首页 > 编程语言 > 详细

spring 事务的两种用法

时间:2017-09-27 20:39:55      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:try   两种   ati   只读   one   cut   type   单位   count   

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‘等等。
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包。

spring 事务的两种用法

标签:try   两种   ati   只读   one   cut   type   单位   count   

原文地址:http://www.cnblogs.com/wenming205/p/7603171.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!