1. 概述

本文将讨论 配置Spring Transactions的正确方法, 如何使用 @Transactional 注解和常见陷阱。

有关核心持久性配置的更深入讨论,请查看 Spring JPA教程

通常,有两种不同的方式来配置事务: 注解和AOP,

每个都有自己的优势。 我们将在这里讨论更常见的注解配置。

促进阅读:

为测试配置单独的Spring DataSource

有关在Spring应用程序中配置单独数据源以进行测试的快速实用教程。

更多

使用Spring Boot加载初始数据的快速指南

在Spring Boot中使用data.sql和schema.sql文件的快速实用示例。

更多

从Spring Boot显示Hibernate / JPA SQL语句

了解如何在Spring Boot应用程序中配置生成的SQL语句的日志记录。

更多

2. 配置不带XML的事务

Spring 3.1引入了@EnableTransactionManagement注释,我们可以在@Configuration类中使用并启用事务支持:

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{ @Bean
public LocalContainerEntityManagerFactoryBean
entityManagerFactoryBean(){
//...
} @Bean
public PlatformTransactionManager transactionManager(){
JpaTransactionManager transactionManager
= new JpaTransactionManager();
transactionManager.setEntityManagerFactory(
entityManagerFactoryBean().getObject() );
return transactionManager;
}
}

但是,如果我们使用Spring Boot项目,并且在classpath上具有spring-data- *或spring-tx依赖项,则默认情况下将启用事务管理。

3. 使用XML配置事务

在3.1之前通常使用annotation-driven namespace:

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="myEmf" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />

4. @Transactional 注解

通过配置事务,我们可以在bean的类和方法上使用@Transactional注解:

@Service
@Transactional
public class FooService {
//...
}

注解还支持进一步配置:

  • 事务的转播类型
  • 事务的隔离级别
  • 事务包装操作的超时
  • 只读标志 -提示持久性事务只读
  • 事务的回滚规则

请注意 - 默认情况下,仅对runtime,unchecked的异常进行回滚。 checked异常不会触发事务的回滚。 当然,我们可以使用rollbackFornoRollbackFor注解来配置异常回滚。

5. 潜在的陷阱

5.1. 事务和代理

在较高的层次上,spring为所有用@transactional注解的类创建代理,无论是在类上还是在方法上。代理允许框架在运行方法之前和之后注入事务逻辑,主要用于启动和提交事务。

重要的是,如果正在实现事务bean的接口,默认情况下代理将是Java动态代理。这意味着只会拦截通过代理进入的外部方法调用。self-invocation调用时即使方法有@transactional注解也不会启用事务

使用代理的另一个注意事项是只有public方法才能用@transactional注解,在其他任何可见性的方法上进行注解时,这些方法都是没有代理的,因为他们会忽略掉这些注解。

这里有详细的代理陷阱

5.2. 更改隔离级别

我们可以通过以下代码做事务隔离级别更改:

@Transactional(isolation = Isolation.SERIALIZABLE)

已经在Spring4.1中 引入; 如果我们在Spring4.1之前的版本上配置隔离级别:

org.springframework.transaction.InvalidIsolationLevelException: Standard JPA does not support custom isolation levels – use a special JpaDialect for your JPA implementation

5.3. 只读事务

readonly标志通常会产生混淆,尤其是在使用JPA时,以下来自Javadoc:

This just serves as a hint for the actual transaction subsystem; it will not necessarily cause failure of write access attempts. A transaction manager which cannot interpret the read-only hint will not throw an exception when asked for a read-only transaction.

实际上设置readOnly标志后,并不能确定不会发生插入或更新。

同样readOnly标志只在事务中有用。如果在事务上下文之外,将会忽略这个标志:

@Transactional( propagation = Propagation.SUPPORTS,readOnly = true )

将会忽略readOnly标志

5.4. 事务日志记录

理解事务相关问题的最有效方法是对事务包中的日志进行调试。

可以设置"org.springframework.transaction"的日志级别为"TRACE"。

6. 结论

使用Java和XML来介绍事务的基本配置,以及@Transactional的使用。

Github.

Spring JPA事务的更多相关文章

  1. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  2. Spring注入JPA+JPA事务管理

    本例实现的是Spring注入JPA 和 使用JPA事务管理.JPA是sun公司开发的一项新的规范标准.在本质上来说,JPA可以看作是Hibernate的一个子集:然而从功能上来说,Hibernate是 ...

  3. Spring Data JPA 事务

    Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作.它提供了包括增删改查等在内的常 ...

  4. Spring的事务管理

    事务 事务:是逻辑上一组操作,要么全都成功,要么全都失败. 事务特性(ACID) 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致 隔离性:一个事务执行的时候,不应该受到其他事务的打扰 ...

  5. (spring-第20回【AOP基础篇】)Spring与事务

    要想了解Spring的事务,首先要了解数据库事务的基本知识,数据库并发会产生很多问题,Spring使用ThreadLocal技术来处理这些问题,那么我们必须了解Java的ThreadLocal技术.下 ...

  6. spring,mybatis事务管理配置与@Transactional注解使用[转]

    spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...

  7. Spring高级事务管理难点剖析

    1Spring事务传播行为 所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播.Spring支持7种事务传播行为 PROPAGATION_REQUIRED(加入已有事务) 如果当前没 ...

  8. 如何实现XA式、非XA式Spring分布式事务

    Spring应用的几种事务处理机制 Java Transaction API和XA协议是Spring常用的分布式事务机制,不过你可以选择选择其他的实现方式.理想的实现取决于你的应用程序使用何种资源,你 ...

  9. 非XA式Spring分布式事务

    Spring应用的几种事务处理机制 Java Transaction API和XA协议是Spring常用的分布式事务机制,不过你可以选择选择其他的实现方式.理想的实现取决于你的应用程序使用何种资源,你 ...

随机推荐

  1. HTML 统一资源定位器

    URL 也被称为网址. URL 可以由单词组成,比如 “w3school.com.cn”,或者是因特网协议(IP)地址:192.168.1.253.大多数人在网上冲浪时,会键入网址的域名,因为名称比数 ...

  2. Linux自有服务(2)-Linux从入门到精通第六天(非原创)

    文章大纲 一.设置主机名二.chkconfig三.ntp服务四.防火墙服务五.rpm管理(重点)六.cron/crontab计划任务(重点)七.学习资料下载八.参考文章   自有服务,即不需要用户独立 ...

  3. spring mybatis错误问题该怎么解决

    1.org.apache.ibatis.exceptions.PersistenceExc org.apache.ibatis.exceptions.PersistenceException: ### ...

  4. shell中sort用法

    1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [rocrocket@rocrocket progr ...

  5. 工作必备之正则匹配、grep、sed、awk

    常用正则:匹配空行:^\s*\n 匹配www开头:^www 添加行号:awk '$0=""NR". "$0' /etc/yum.conf 1.所有域名前加www ...

  6. websocket 的基本用法

    项目当中使用到了websocket,以前的项目当中使用到了另外一个类似的socket.io,两者的区别和联系在另外一篇文章当中有提及,这里就简单的写下websocket的用法 下面的例子是阮一峰的We ...

  7. 极简让ingress-nginx最新版(0.25.0)跑起来

    裸步骤: 一,manadatory.yaml apiVersion: v1 kind: Namespace metadata: name: ingress-nginx labels: app.kube ...

  8. 实验十四 团队项目评审&个人学习总结

    实验十四 课程学习总结 项目 内容 这个作业属于哪个课程 (https://www.cnblogs.com/nwnu-daizh/) 这个作业的要求在哪里 (https://www.cnblogs.c ...

  9. ESA2GJK1DH1K基础篇: 测试APP扫描Air202上面的二维码绑定通过MQTT控制设备(兼容SIM800)

    前言 此程序兼容SIM800 如果想绑定SIM800,请把其IMEI号,生成二维码,用手机APP扫描. 实现功能概要 APP通过扫描二维码获取GPRS设备的IMEI号,然后设置订阅的主题:device ...

  10. [Python] 递归返回值 为 None 的问题

    递归返回值 为 None 的问题 解决办法: 在递归调用下一个 递归 函数前面,一定要加上 return,否则就会返回 None 如红色 所处的return: def getAllCityUrl(ur ...