zoukankan      html  css  js  c++  java
  • spring事务

    1.事务

    数据库的事务:一组操作处理的基本单元(一组SQL命令)。

    2.事务的特性(ACID

      ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。

    原子性:要么一起发生,要么都不发生

    一致性:数据不被破坏

    持久性:永久保存到数据库(commit)

    隔离性:不同的用户操作事务之间不干扰

    A.编程式

    我的博客有介绍,Java原生的jdbc编程:http://www.cnblogs.com/57rongjielong/category/1104680.html

    B.xml声明式事务

      配置spring配置文件xml中的事务管理组件

      Spring整合JDBC中的事务管理器:DataSourceTransactionManager

    spring中的事务控制方式是以bean组件的方法为单位的。如果一个方法正常执行完毕,则该方法内的全部数据库操作按照一次事务提交。

     1 <!-- 设置事务的类型和  控制事务的范围    设置通知-->
     2 <tx:advice id="advice" transaction-manager="tm">
     3          <tx:attributes>
     4              <tx:method name="find*" read-only="true"/>
     5              <tx:method name="get*" read-only="true"/>
     6              <tx:method name="count*" read-only="true"/>
     7              <!-- <tx:method name="update*" read-only="false" rollback-for="Exception"/> -->
     8              <tx:method name="add*" read-only="false" rollback-for="Exception"/>
     9              <tx:method name="*" read-only="false"/>
    10          </tx:attributes>
    11      </tx:advice>
    12 <!-- 设置切面 -->
    13      <aop:config proxy-target-class="true">
    14          <aop:advisor advice-ref="advice" 
    15          pointcut="execution(* com.web.service..*.*(..))"/>
    16      
    17      </aop:config>

    C.注解式声明事务

      a声明事务管理器

      b开启事务注解扫描

     1 <!-- 开启spring 声明式事务管理 -->
     2     <!-- 注解方式 -->
     3     <!--1. 声明spring 事务管理器 
     4         事务管理器需要获取连接,才能管理事务,所以要注入数据源属性
     5     -->
     6     <bean id="tm" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     7         <property name="dataSource" ref="dataSource"></property>
     8     </bean>
     9     
    10     <!--2. 开启事务注解 
    11     transaction-manager:设置哪个bean组件作为事务管理器
    12     proxy-target-class:是否使用动态代理
    13     -->
    14     <tx:annotation-driven transaction-manager="tm" proxy-target-class="true"/>

      c在需要使用事务管理的bean中加入@Transactional注解

     1 /**
     2  * @Transactional可以写在类或者方法上面   写在类上控制所有的方法    写在方法上可以缩小控制范围
     3  * 标记了该注解的类或者方法才会被spring的事物管理器管理起来
     4  * propagation:事务传播策略设置
     5  * Propagation.REQUIRED:看当前方法是否有事务,如果没有则新建一个,如果有则加入当前的事务管理   默认值
     6  * NOT_SUPPORTED:事务管理器不会启动事务管理
     7  * 
     8  * readOnly:事务类型
     9  * false:可读写事务    支持增删改   数据库读写事务需要额外分配如回滚空间等资源,损耗更大
    10  * true:只读事务     支持查询操作 不能用于增删改    数据库只读事务的资源损耗更小
    11  * 
    12  * isolation:(了解)设置事务隔离级别   
    13  * Isolation.DEFAULT:符合事物的级别特性的隔离级别
    14  * 
    15  * rollbackFor:指定哪些非运行时异常也要进行回滚操作   参数是类类型
    16  * rollbackForClassName:参数是类型字符串数组
    17  * 
    18  * @author Administrator
    19  *
    20  */
     1 @Service
     2 @Transactional(propagation=Propagation.REQUIRED,readOnly=true,isolation=Isolation.DEFAULT,
     3 rollbackFor=java.lang.ClassNotFoundException.class)
     4 public class DeptServiceImpl implements DeptService {
     5 
     6     @Resource
     7     DeptDao deptDao;
     8     /**
     9      * 同时插入两条Dept记录,要求位于同一事务管理
    10      * @throws ClassNotFoundException 
    11      * 
    12      */
    13     @Transactional(propagation=Propagation.REQUIRED,readOnly=false,
    14             rollbackForClassName="ClassNotFoundException")
    15     public void addBatch() throws ClassNotFoundException{//事务A开启
    16         Dept dept = new Dept(60,"测试部门1","位置1");
    17         deptDao.add(dept);//保存第一条部门记录
    18         
    19         //模拟异常
    20 //        Integer.valueOf("abcd");//运行时异常
    21         Class.forName("abcd");//检查异常/非运行时异常
    22         
    23         Dept dept2 = new Dept(70,"测试部门2","位置2");
    24         deptDao.add(dept2);//保存第二条部门记录
    25         
    26     }//事务A结束
    27 
    28 }
  • 相关阅读:
    数据库练习题
    支付类项目
    crm项目整理
    React 生成二维码
    Charles抓页面配置mac端
    Python之列表生成式、生成器、可迭代对象与迭代器
    01 Django基础
    12 jQuery的ajax
    11 事件委托(事件代理)
    10 jQuery的事件绑定和解绑
  • 原文地址:https://www.cnblogs.com/57rongjielong/p/7808941.html
Copyright © 2011-2022 走看看