spring 事务的概念

事务的概念

什么叫事务

事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。

事务的特性

原子性

事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行。

一致性

事务在完成时,必须是所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。

隔离性

一个事务的执行不能被其他事务所影响。

持久性

一个事务一旦提交,事物的操作便永久性的保存在DB中。即使此时再执行回滚操作也不能撤消所做的更改。

Spring的事务管理

编程式事务

自己写代码来控制(不可取)

Spring 出现以前,编程式事务管理对基于 java 的应用来说是唯一选择。

用过 JDBC 的人都知道 connection.setAutoCommit(false)commit()rollback()

声明式事务

不用在java程序代码中体现事务的commitrollback

Spring 的声明式事务管理在底层是建立在 AOP 的基础之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

声明式事务例子:

引入所支持jar

1. 声明一个事务管理器并注入数据源

2. 配置事务的转播属性

3. 配置切入点

DataSourceTransactionManager事务管理器

<!-- 事务管理器 -->

     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  

<property name="dataSource" ref="dataSource"/>  

</bean>

<!-- 事务传播属性 -->

    <tx:advice id="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="*" propagation="REQUIRED" />

</tx:attributes>

</tx:advice>

     <!-- 设置切入点 -->

    <aop:config>  

        <aop:pointcut id="point"  expression="execution(* com.service.PersonServiceImpl.*(..))" />  

        <aop:advisor advice-ref="txAdvice" pointcut-ref="point" />          

</aop:config>  

 

注意:要想事务回滚,必须往外抛出异常,不能try..catch,(可以try住,但是要自己thorw

注解式事务

<!—启动注释事务 -->  

<tx:annotation-driven  transaction-manager="transactionManager" />

<!—注解使用-->

@Transactional(propagation=Propagation.REQUIRED,timeout=30)

public void insert() {//省略}

 

<!-- 事务管理器 -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  

<property name="dataSource" ref="dataSource"/>  

</bean>

<!--启动注解事务 -->

<tx:annotation-driven  transaction-manager="transactionManager" />

 

Transactional明细说明:

属性名 

说明 

isolation 

事务隔离级别 

noRollbackFor 

一组异常类,遇到时不回滚。默认为{}

noRollbackForClassName 

一组异常类名,遇到时不回滚,默认为{}

propagation 

事务传播行为 

readOnly 

事务读写性 

rollbackFor 

一组异常类,遇到时回滚 

rollbackForClassName 

一组异常类名,遇到时回滚 

timeout 

超时时间,以秒为单位 

value 

可选的限定描述符,指定使用的事务管理器 

 

事务的传播属性(行为)

REQUIRED

表示当前方法必须要在事务中运行,如果当前有事务,就采用当前的事务。如果当前没有事务,就创建一个新事务。

支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

 

REQUIRES_NEW

表示当前方法,必须要在新事务中运行,如果当前已经存在事务,把当前事务挂起。

SUPPORTS

表示当前方法,可以在事务环境中运行,也可以在非事务环境中运行。如果当前存在事务,就在当前事务中运行。如果当前没有事务,就以非事务方式执行。

NOT_SUPPORTED

表示当前方法,必须要在以非事务方式执行,如果当前存在事务,就把当前事务挂起。

NEVER

表示当前方法,必须以非事务方式执行,如果当前存在事务,则抛出异常。

MANDATORY

表示当前方法,一定要在事务中运行,如果当前有事务,就采用当前事务,如果当前没有事务,就抛出异常。

NESTED

事务的隔离级别

Isolation.DEFAULT

这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
 另外四个与JDBC的隔离级别相对应

Isolation.UNCOMMITTED

 

这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。
      这种隔离级别会产生脏读,不可重复读和幻像读。

Isolation.READ_COMMITTED

 

 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据

Isolation. REPEATABLE_READ

这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
  它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)

Isolation. SERIALIZABLE

 

想要学习更多的后台基础的可搜索博客号:weixin_41920152

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值