Spring的事务

1.事务的四个关键属性(ACID)

原子性(atomicity): 事务是一个原子操作, 由一系列动作组成. 事务的原子性确保动作要么全部完成要么完全不起作用.

一致性(consistency): 一旦所有事务动作完成, 事务就被提交. 数据和资源就处于一种满足业务规则的一致性状态中.

隔离性(isolation): 可能有许多事务会同时处理相同的数据, 因此每个事物都应该与其他事务隔离开来, 防止数据损坏.

持久性(durability): 一旦事务完成, 无论发生什么系统错误, 它的结果都不应该受到影响. 通常情况下, 事务的结果被写到持久化存储器中.

2.Spring事务管理api

Spring事务管理的两种方式

第一种 编程式事务管理(不用)

第二种 声明式事务管理

(1)基于xml配置文件实现

(2)基于注解实现

3.spring事务的介绍

Spring 的核心事务管理抽象是

                     

它为事务管理封装了一组独立于技术的方法. 无论使用 Spring 的哪种事务管理策略(编程式或声明式), 事务管理器都是必须的.

 

4. 声明式事务管理(xml配置)

首先引入tx,aop标签
第一步 配置事务管理器
 <!-- 事务管理器 不再使用jdbc的commit和rollbacke 必须使用事务管理器提供 -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	<property name="dataSource" ref="dataSource"></property>
</bean>
第二步 配置事务增强
<!-- 定义通知  通知代码spring已经实现 -->
    <tx:advice id="myAdvice" transaction-manager="transactionManager">
    	<tx:attributes>
    		<tx:method name="update*" propagation="REQUIRED" timeout="5"/>
    		<tx:method name="save*" propagation="REQUIRED"/>
    		<tx:method name="delete*"/>
    		<tx:method name="*" read-only="true"/>
    	</tx:attributes>
</tx:advice>
第三步 配置切面
 <aop:config>
   		<!-- 切点 -->
    	<aop:pointcut expression="execution(* cn.*..*.testm.dao.*.*(..))" id="myPiont"/>
    	<!-- 事务通知需要通知方法 -->
    	<aop:advisor advice-ref="myAdvice" pointcut-ref="myPiont"/>
</aop:config>

5. 声明式事务管理(注解)

第一步 配置事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	<property name="dataSource" ref="dataSource"></property>
</bean>
 
第二步 配置事务注解
<!--开启注解-->
<context:component-scan base-package="cn.et.lesson04.testm"></context:component-scan>
第三步 在要使用事务的方法所在类上面添加注解
@Repository
public class AcDaoImpl {

6. 事务的传播属性

<!--
    	propagation="REQUIRED":方法和方法之间父子关系
    	REQUITED 没有事务创建一个事务 有事务使用当前事务
    	REQUITED_NEW 不管父方法是否存在事务 都会创建事务
    	SUPPORTS 父方法存在事务 使用当前事务 没有事务使用jdbc的事务(自动提交)
    	NOT_SUPPORTED 不管父方法是否存在事务 都不会使用事务(挂起事务)
    	MANDATORY 必须在事务环境运行父方法没有事务 抛出异常
    	No existing transaction found for transaction marked with propagation 'mandatory'
    	NEVER 父方法不能存在事务 有事务就抛出异常
    	Existing transaction found for transaction marked with propagation 'never'
-->

7. 事务的隔离级别

<!--
isolation="DEFAULT"隔离级别
    	DEFAULT 使用数据库本身的隔离级别ORACLE(读已提交)MYSQL可重复读
    	READ_COMMITTED spring实现读未提交(脏读)
    	READ_UNCOMMITTED spring实现读已提交(不可重复读+幻读)
    	REPEATABLE_READ spring实现可重复读(幻读)
    	SERIALIZABLE spring实现串行化(已解决)
    
    	spring事务 运行过程中碰到运行时异常 自动回滚 非运行时异常不会回滚
    rollback-for="" 指定会自动回滚的非运行时异常
    no-rollback-for=""  指定某些运行时异常抛出时 不回滚
    
    	只读事务  (出特定的方法以外其他的业务逻辑方法 都不应该操作事务)
    	read-only="true" 设置只读事务
    
    	超时事务
    	timeout=10~30左右,mysql默认10s自动超时,oracle永不超时
 
<tx:method name="update*" isolation="DEFAULT" timeout="5" no-rollback-for="java.lang.RuntimeException" rollback-for="Exception"/>
    	 -->





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值