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 }

 

posted @ 2017-11-09 13:37  57容杰龙  阅读(167)  评论(0编辑  收藏  举报