关于 Spring 事务 理解

  1.事务由四个特性:ACID

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

一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。【操作一致,保数据完整

隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。【处理数据独立,互不干扰

持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。【数据持久保存

  2.事务传播行为:当事务方法被另一个事务方法调用时,必须指定事务应该如何传播

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

PROPAGATION_SUPPORTS    支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY     支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW     新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED     以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER    以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED    如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。

  3.事务隔离级别

Read Uncommitted(一个事务可以读取另一个事务未提交内容)最低级别,任何情况都无法保证

Read Committed(一个事务只能读取另一个事务提交的内容)可避免脏读的发生。

Repeatable Read(对一个事务的内容可以多次重读,多次提交)可避免脏读、不可重复读的发生。

Serializable(可串行化,按事务顺序执行)可避免脏读、不可重复读、幻读的发生。(最高级)

  4.事务超时

  所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。  默认设置为底层事务系统的超时值,如果底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。

  5.事务只读属性

    只读事务用于客户代码只读但不修改数据的情形,只读事务用于特定情景下的优化,比如使用Hibernate的时候。默认为读写事务。

二、spring4集合Hibernate5的事务配置:

  声明式事务管理配置,的细粒度只能到方法级别,也就是一整个方法就是一个事务,方法结束后提交事务。编程式事务可以在方法局部创建事务,并提交,一般使用try/catch捕获异常并对未成功的事务进行回滚操作。一下是声明式事务的一种配置方式。

  applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
      http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        ">

<!-- 导入properties配置文件 -->
    <context:property-placeholder location="classpath*:/jdbc.properties"/>

<!-- 扫描注解包 -->
    <context:component-scan base-package="dao.daoImpl"/>
    <context:component-scan base-package="service.serviceImpl" />

<!-- 数据源基本配置 -->
    <bean>
        <property value="${jdbc.username}"/>
        <property value="${jdbc.password}"/>
        <property value="${jdbc.url}"/>
        <property value="${jdbc.driverClassName}"/>
    </bean>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d94447d92b5394097ec76eb2af13b4d4.html