Spring JPA事务
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异常不会触发事务的回滚。 当然,我们可以使用rollbackFor和noRollbackFor注解来配置异常回滚。
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的使用。
Spring JPA事务的更多相关文章
- 玩转spring boot——结合JPA事务
接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- Spring注入JPA+JPA事务管理
本例实现的是Spring注入JPA 和 使用JPA事务管理.JPA是sun公司开发的一项新的规范标准.在本质上来说,JPA可以看作是Hibernate的一个子集:然而从功能上来说,Hibernate是 ...
- Spring Data JPA 事务
Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作.它提供了包括增删改查等在内的常 ...
- Spring的事务管理
事务 事务:是逻辑上一组操作,要么全都成功,要么全都失败. 事务特性(ACID) 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致 隔离性:一个事务执行的时候,不应该受到其他事务的打扰 ...
- (spring-第20回【AOP基础篇】)Spring与事务
要想了解Spring的事务,首先要了解数据库事务的基本知识,数据库并发会产生很多问题,Spring使用ThreadLocal技术来处理这些问题,那么我们必须了解Java的ThreadLocal技术.下 ...
- spring,mybatis事务管理配置与@Transactional注解使用[转]
spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...
- Spring高级事务管理难点剖析
1Spring事务传播行为 所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播.Spring支持7种事务传播行为 PROPAGATION_REQUIRED(加入已有事务) 如果当前没 ...
- 如何实现XA式、非XA式Spring分布式事务
Spring应用的几种事务处理机制 Java Transaction API和XA协议是Spring常用的分布式事务机制,不过你可以选择选择其他的实现方式.理想的实现取决于你的应用程序使用何种资源,你 ...
- 非XA式Spring分布式事务
Spring应用的几种事务处理机制 Java Transaction API和XA协议是Spring常用的分布式事务机制,不过你可以选择选择其他的实现方式.理想的实现取决于你的应用程序使用何种资源,你 ...
随机推荐
- CTF——web安全中的一些绕过
function check($number) { $one = ord('1'); $nine = ord('9'); for ($i = 0; $i < strlen($number); $ ...
- .NET Core 下调用WebAPI
前言 今天我们介绍多种客户端调用WebApi的方式,可以是原生写的,也可以借助.NET 框架下的其他HTTP库.我们一起来看看它们之间的一些异同吧- RestSharp 首先要介绍的就是这款REST ...
- Android Xutils3 完全解析
1.先来认识一下xUtils3 1)xUtils3简介 xUtils是基于Afinal开发的目前功能比较完善的一个Android开源框架,最近又发布了xUtil3.0,在增加新功能的同时又提高了框架的 ...
- service---七月十九号实验
目录 service---七月十九号实验 1 startService.bindService 2 分析生命周期变化 问题思考: service---七月十九号实验 1 startService.bi ...
- Linux从入门到放弃、零基础入门Linux(第三篇):在虚拟机vmware中安装linux(二)超详细手把手教你安装centos6分步图解
一.继续在vmware中安装centos6.9 本次安装是进行最小化安装,即没有图形化界面的安装,如果是新手,建议安装带图形化界面的centos, 具体参考Linux从入门到放弃.零基础入门Linux ...
- Django框架(九)-- 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
一.创建多表模型 一对一:OneToOneField 一对多:ForeignKey 多对多:ManyToManyField 创建表时,会自动添加一个nid字段,并且自增,所以id可以不用手动创建 On ...
- sql server 如何在全库中查找数据在哪个表
1.查找字段在库中哪个表 如果要查找FName select a.name,b.name from syscolumns a inner join sysobjects b ...
- mysql 命令修复表
如果在断电.硬重启服务器等情况下,可能会造成有些表损坏,这时就需要修复 修复表前需要将mysql停止 centos7 用 systemctl stop mysqld.service 来停止 然后进入到 ...
- 手写xpath定位公式
做web自动化,之前我们已经将环境搭建好了,现在的话总结下怎么定位元素的 最基本的元素定位是有6种: driver.find_element_by_id("") driver.fi ...
- POJ3070 斐波那契数列递推 矩阵快速幂模板题
题目分析: 对于给出的n,求出斐波那契数列第n项的最后4为数,当n很大的时候,普通的递推会超时,这里介绍用矩阵快速幂解决当递推次数很大时的结果,这里矩阵已经给出,直接计算即可 #include< ...