zoukankan      html  css  js  c++  java
  • spring事务配置总结

    spring事务配置总结

    第一种:使用注解(推荐)
    <!-- 第一步 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <!--注入sessionFactory-->
      <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!-- 第二步 开启事务注解 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    业务层
    @Transactional(isolation=Isolation.READ_COMMITTED,propagation=Propagation.REQUIRED,rollbackFor=Exception.class,readOnly=false)
    public class UserServer{

      public void insert(){}

      public void delete(){}

      public void update(){}

      @Transactional(propagation=Propagation.SUPPORTS)
      public User selectById(){}
    }

    第二种:纯xml配置
    <!-- 第一步 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <!-- 注入dataSource -->
      <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 第二步 配置事务增强 -->
    <tx:advice id="txadvice" transaction-manager="transactionManager">
      <!-- 做事务操作 -->
      <tx:attributes>
        <!-- 设置进行事务操作的方法匹配规则 -->
        <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
        <tx:method name="*" propagation="REQUIRED" isolation="READ_COMMITTED" read-only="false" rollback-for="Exception"/>
      </tx:attributes>
    </tx:advice>

    <!-- 第三步 配置切面 -->
    <aop:config>
      <!-- 切入点 -->
      <aop:pointcut expression="execution(* xxx.xxx.*.*(..))" id="pc"/>
      <!-- 切面 -->
      <aop:advisor advice-ref="txadvice" pointcut-ref="pc"/>
    </aop:config>

    ------------------------------------------------------------------

    事务属性:

    1>隔离级别isolation:
      READ_UNCOMMITTED:读未提交,事务之间可以读取到对方未提交的数据,会导致【脏读,不可重复读,幻影读】
      READ_COMMITTED:读提交,事务之间只可以读取到对方已提交的数据,可以防止【脏读】【建议使用】
      REPEATABLE_READ:可重复读,一个事务多次读取同一条数据,结果一致,可以防止【脏读,不可重复读】
      SERIALIZABLE:序列化读,多个事务串行发生,可以防止一切非法的读取。
      *注意:隔离级别逐渐提高,并发性越来越差,但安全性越来越好。
      *非法的读取状态:
        1. 脏读:事务读取到了其他事务未提交的数据(重点记忆)
        2. 不可重复读:一个事务中多次读取同一条数据,但结果不一致。
        3. 幻影读:一个事务中多次读取同一张表,表的行数不一致。
      *在oracle中只支持 读提交和序列化读 且默认为 【读提交】

    2>传播性propagation:防止事务嵌套。ServiceA的方法中调用了 ServiceB中方法。
      supports: 如果当前已有事务环境,则融入,否则在非事务环境下执行。适合查询业务
      required: 如果当前已有事务环境,则融入,否则新启动一个事务,在事务中运行。适合增删改业务
    3>读写性readOnly:
      true:只读事务,适合查询业务,在事务中只允许查询操作
      fasle:读写事务,适合增删改业务,事务中允许查询和改动(默认)
    4>回滚性rollback-for:
      在业务中抛出RuntimeException异常时自动回滚。
      在业务中抛出Exception异常时依然提交(默认)。

    ----------------------------------------------------------------------------

    事务的概念:

    事务是数据库保证数据完整性的一种机制,是数据库操作的最小单元,包括一条或者多条sql语句。在同一个事务的多条sql语句执行的过程中,要么同时成功,事务成功(事务提交:commit);如果有一条sql语句执行失败,整个事务失败,事务回滚(rollback)。

    事务的开始:

      同一个事务中的多条sql中的第一条sql执行开始

    事务结束:

      commit

      rollback

    事务的特点:ACID(面试概念)
    Atomicity:原子性,同一个事务中的多条sql不可分割。

    Consistency:一致性,事务在操作前后的状态一致。

    Isolation:隔离性,事务之间相互独立,没有影响。

    Durability:持久性,事务的操作是持久化数据库

  • 相关阅读:
    从错误状态恢复虚拟机
    OpenStack手动从数据库中删除实例
    对于flat_interface与public_interface的理解
    2. 拓扑图
    Cinder相关命令收集
    Nova相关命令收集
    14. Launch an instance
    9. Add the Block Storage service
    8. Add the dashboard
    7. Add a networking service
  • 原文地址:https://www.cnblogs.com/lzhl/p/6520486.html
Copyright © 2011-2022 走看看