Spring管理事务

Spring管理事务

      PlatformTransactionManager 帮助我们管理仁义平台的事务。

       Hibernate  HinernateTransactionManager

        事务:(4大特征)

    1.一致性

   2.原子性

    3.持久性

   4. 隔离性


  事务安全:

 事务线程安全:脏读 、不可重复读、  幻读、读为提交

  隔离级别:  1  2 4 (读已提交) 8


    所有事务的操作有三步:

      开启事务

      提交事务

      回滚事务

    spring管理事务利用的是spring aop思维,将事务的操作织入到目标对象中。



 Spring 管理事务的属性:

    隔离级别  是否只读  事务的传播行为(7钟)




  Spring 管理事务的三种方式:


  (1)代码式

         1).配置事务管理对象

          2).配置事务管理的模块

           3).在service中注入模块对象,然后调用execute方法

package cn.hd.spring_transaction.impl;

import cn.hd.spring_transaction.UserDao;
import cn.hd.spring_transaction.UserService;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

import javax.annotation.Resource;

public class UserServiceImpl implements UserService {
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    @Resource(name = "transactionTemplate")
    private TransactionTemplate tt;

    public void setTt(TransactionTemplate tt) {
        this.tt = tt;
    }

    @Override
    public void transform(Integer form, Integer to, Integer money) {
            /*TransactionCallbackWithoutResult()没有任何返回值的回调函数*/
            tt.execute(new TransactionCallbackWithoutResult() {
                @Override
                protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
                    userDao.increase(to,money);
                    int i = 1/0;
                    userDao.decrease(form,money);
                }
            });
    }
}

      2.xml配置

         1).有一个事务管理对象

<bean name="transactionManager" 
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

        2)。配置事务的通知

               标签名tx:advice   id 给当前的事务起个标号

              Transact ....配置刚刚的事务管理对象

             配置参数 :methor name 可以式具体某个方法(方法名)比较麻烦,可以通过通配符的

             方式去配置

          add*delete*update*get                  persist*remove*modify*find*

              要求你的service命名必须规范。

              isolation:隔离级别使用默认即可

             propagation:事务传播行为required

            read-only:是否只读如果查找true   否则为false

<!--配置事务通知-->
<tx:advice id="myAdvice" transaction-manager="transactionManager">
    <!--事务的属性-->
    <tx:attributes>
        <!--给那个方法添加事务;隔离:默认(级别4);传播行为:如果事物存在运行,不存在新建;是否只读-->
        <tx:method name="transform" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="get*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/>
        <tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="find*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/>
        <tx:method name="persist*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="modify*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="remove*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
    </tx:attributes>
</tx:advice>

 3.将通知织入到目标对象

  

<!--将通知织入到目标对象-->
<aop:config>
    <!--切点-->
    <aop:pointcut id="txPc" expression="execution(* cn.hd.spring_transaction..impl.*ServiceImpl.*(..))"></aop:pointcut>
    <!--切面-->
    <aop:advisor advice-ref="myAdvice" pointcut-ref="txPc"></aop:advisor>
</aop:config>
                           
  配置切面不再使用aop:aspect,而是aop:advisor

   3.注解配置

    1.开启注释模式

 

<!--开启注解模式-->

<tx:annotation-driven></tx:annotation-driven>

2.在你想设置的事务的地方

	@Transactional(isolation = Isolation.DEFAULT,propagation = 
Propagation.REQUIRED,readOnly = false)

可以有两个位置

   1)类上面,该类中所有方法都会使用以上的参数事务

     2)方法名上面,该方法使用参数中的事务

           如果两个都设置以方法名上面的事务为准

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值