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 }