zoukankan      html  css  js  c++  java
  • Spring Data JPA 事务

    Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套 JPA 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展。以下介绍JPA事务

    1.事务基础:

    事务的基本概念:即访问并可能更新数据库中各种数据项的一个程序执行单元。

    需要管理事务的执行,要么成功、要么失败,一但失败,所有操作将回滚到初始状态,一但成功,则进行持久化。

    事务特性ACID:原子性、一致性、隔离性(并发执行的事务不能相互干扰)、持久性(对数据库的改变是永久性)

    Spring Data JPA事务分为:JTA事务(分布式事务,多种数据库)、RESOURCE_LOCAL事务(本地事务,数据库级别,仅支持一种数据库)

    2.数据库事务并发带来的问题

    脏读:一句话表达事务读取了其他并发事务未提交的数据

    事务B读取了事务A未提交的数据,事务B按未提交的数据进行执行并提交。而事务A又对数据进行修改后再提交。这样事务B读取的数据与事务A提交的数据不一致。

    不可重复读:同一个事务先后两次或两次以上读取同一数据,结果不一样。

    事务C读取了数据,事务还没有提交。

    事务D修改了数据,并提交事务。随后,事务C再次读取时,发现数据变了。

    幻读:跟不可重复读类似,侧重记录的数量(行数),不可重复读侧重于数据的值。

    3.事务的传播特性:

    FunctionA调用FunctionB

    1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启
    2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
    3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
    4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
    5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。
    6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常
    7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行

    4.事务的隔离级别:

    1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应
    2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
    3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
    4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
    5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

    通常使用数据库的默认隔离级别即可,基本不需要进行设置

    MYSQL: 默认为REPEATABLE_READ级别
    SQLSERVER: 默认为READ_COMMITTED

    5.配置事务 

    先在spring配置文件中引入<tx:>命名空间

    5.1通过注解配置事务:

    <!-- 事务管理器配置, Hibernate单数据源事务 -->
        <bean id="defaultTransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>
        
        <!-- 使用annotation定义事务 -->
        <tx:annotation-driven transaction-manager="defaultTransactionManager" proxy-target-class="true" />

    配置完之后,就可通过@Transactional 注解的bean自动配置为声明式事务支持 .

    注意以下问题:

    a.<tx:annotation-driven/>元素的出现开启了事务行为,@Transactional  是元数据标记,只有在前者配置后,再使用@Transactional才能开启事务

    b.@Transactional 可以添加到Dao层或Servive层(具体的实现类)的 public 可见度的方法上,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的

    5.2通过AOP配置事务:

        <!--事务的 AOP 配置-->
        <!--advisor-->
        <tx:advice id="applicationAdvisor" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="*" propagation="REQUIRED"/>
                <tx:method name="load*" propagation="REQUIRED" read-only="false" isolation="DEFAULT" rollback-for="UserNotFoundException,UserNotFound2Exception"/>
                <tx:method name="is*" propagation="REQUIRED" read-only="false"/>
            </tx:attributes>
        </tx:advice>
    
        <aop:config>
            <aop:advisor advice-ref="applicationAdvisor" pointcut="execution(* com.mm.*.service.impl.*.*(..))"/>
        </aop:config>
  • 相关阅读:
    NGINX
    nginx修改上传文件大小限制
    Mysql主从复制机制原理
    MongoDB系列---用户及权限管理02
    MongoDB系列---入门安装操作01
    浅谈原理--hashCode方法
    ActiveMQ学习总结------原生实战操作(下)03
    dubbo配置负载均衡、集群环境
    ActiveMQ学习总结------入门篇01
    vsftpd上传文件大小为0(主动模式)
  • 原文地址:https://www.cnblogs.com/gsyun/p/6833553.html
Copyright © 2011-2022 走看看