1.概述

本教程将讨论配置Spring Transactions ,使用@Transactional批注和常见陷阱的正确方法

要更深入地讨论核心持久性配置,请查看Spring with JPA教程 。

有两种不同的配置事务的方法– 批注和AOP –每种都有自己的优势–我们将在这里讨论更常见的批注配置

2.在不使用XML的情况下配置事务

Spring 3.1引入@EnableTransactionManagement批注该批注将在@Configuration类中使用,并启用事务支持:

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

3.使用XML配置事务

在3.1之前,或者如果不能使用Java,则这是XML配置 ,使用注释驱动和名称空间支持:

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

配置了事务后,现在可以在类或方法级别使用@Transactional注释Bean:

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

注释支持进一步的配置

  • 交易的传播类型
  • 交易的隔离级别
  • 事务包装的操作的超时
  • readOnly标志 –持久性提供程序的提示,该事务应为只读
  • 详细的回滚配置

5.潜在的陷阱

5.1。 交易和代理

在较高的级别上, Spring会在类或任何方法上为所有带有@Transactional注释的类创建代理 。 代理允许框架在调用方法之前和之后注入事务逻辑–主要用于启动和提交事务

要记住的重要一点是,如果事务Bean正在实现接口,则默认情况下,代理将是Java动态代理 。 这意味着将仅拦截通过代理传入的外部方法调用- 任何自调用将不会启动任何事务 -即使该方法使用@Transactional进行了注释。

使用代理的另一个警告是, 仅公共方法应使用@Transactional进行注释 -其他可见性的方法将仅默默地忽略该注释,因为这些代理没有被代理。

本文在这里详细讨论了进一步的代理pitfal 。

5.2。 更改隔离级别

将Spring配置为与JPA一起使用时的主要陷阱之一是,更改事务语义的隔离将不起作用– JPA不支持自定义隔离级别 。 这是JPA的限制, 不是Spring的限制; 但是,更改@Transactional 隔离属性将导致:

org.springframework.transaction.InvalidIsolationLevelException:标准JPA不支持自定义隔离级别–为您的JPA实现使用特殊的JpaDialect

5.3。 只读交易

readOnly标志通常会引起混乱,尤其是在使用JPA时; 从javadoc:

这只是实际交易子系统的提示。 它不一定会导致写访问尝试失败。 当请求只读事务时,无法解释只读提示的事务管理器不会引发异常。

事实是, 不能保证在设置readOnly标志时不会发生插入或更新-它的行为取决于供应商,而JPA与供应商无关。

同样重要的是要了解readOnly标志仅在事务内部相关; 如果操作发生在事务上下文之外,则仅忽略该标志。 一个简单的示例将调用带有以下注释的方法:

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

从非事务上下文中-将不会创建事务,并且将忽略readOnly标志。

5.4。 交易记录

通过微调事务包中的日志记录 ,还可以更好地理解与事务相关的问题。 Spring中的相关软件包是“ org.springframework.transaction”,应使用TRACE的日志记录级别对其进行配置。

六,结论

我们介绍了同时使用Java和XML的事务语义的基本配置,如何使用@Transactional以及事务策略的最佳实践。 还讨论了Spring对事务测试的支持以及一些常见的JPA陷阱

这个简单项目的实现可以在github项目中找到–这是一个基于Eclipse的项目,因此应易于导入和运行。

参考:在baeldung博客上,我们JCG合作伙伴 Eugen Paraschiv 与Spring 3和JPA的交易 。

翻译自: https://www.javacodegeeks.com/2011/12/transaction-configuration-with-jpa-and.html

使用JPA和Spring 3.1进行事务配置相关推荐

  1. spring.jpa配置_使用JPA和Spring 3.1进行事务配置

    spring.jpa配置 1.概述 本教程将讨论配置Spring Transactions ,使用@Transactional批注和常见陷阱的正确方法 . 有关核心持久性配置的更深入讨论,请查看Spr ...

  2. Spring事务——Spring 2.X的事务配置策略

    为什么80%的码农都做不了架构师?>>>    Spring 2.X的事务配置策略 虽然前面介绍的TransactionProxyFactoryBean配置策略简单易懂,但配置起来极 ...

  3. 让Spring架构减化事务配置(转)

    让Spring架构减化事务配置(转) 注:原文章曾发表在it168   Spring颠覆了以前的编程模式,引入了IOC等全新的概念,广受大家的喜爱.目前大多数j2ee项目都已经采用Spring框架.S ...

  4. 【Spring】——声明式事务配置详解

    事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性.本文主要讲解事务涉及到一些概念以及spring中事务的使用.如有理解偏颇之处,恳请各位大神指正,小编不胜感激! 1.何为事务? 事 ...

  5. Spring笔记(4) - Spring的编程式事务和声明式事务详解

    一.背景 事务管理对于企业应用而言至关重要.它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性.就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到操作 ...

  6. jdbc、jdbcTemplate、hibernate、jpa、spring之间的关系

    JPA 的底层实现是一些流行的开源 ORM 框架,因此JPA其实也就是java实体对象和关系型数据库建立起映射关系,通过面向对象编程的思想操作关系型数据库的规范 Getting started wit ...

  7. SSH深度历险(六) 深入浅出----- Spring事务配置的五种方式

    这对时间在学习SSH中Spring架构,Spring的事务配置做了具体总结.在此之间对Spring的事务配置仅仅是停留在听说的阶段,总结一下.总体把控.通过这次的学习发觉Spring的事务配置仅仅要把 ...

  8. spring事务配置

    2019独角兽企业重金招聘Python工程师标准>>> 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识. ...

  9. 总结xml配置spring-aop声明式事务配置与hibernate报错:** isno active spring和hibernate整合,原因会话工厂去路(到spring不仅仅是bean)错误

    spring事务管理太厉害了!!可以不再自管事务开发了! spring aop声明式事务配置 问题: 困扰我近十多天的的spring事务管理终于解决了, 再也不用自己管理事务了 嗯,可以删该死的hib ...

最新文章

  1. 设计建造者模式java代码,Java设计模式-建造者模式
  2. SAP MM ME21N 创建PO时报错 - Net price in CNY becomes too large – 之原因分析
  3. 1.10 字符串的替换(replace()、replaceFirst()和replaceAll())
  4. Linux 命令之 apt-mark -- 对 APT 软件包设置标记
  5. ESP32 入门教学,不入门,不教学
  6. 【李宏毅机器学习】Why Deep Learning(p15) 学习笔记
  7. Linux系统定时任务Crond
  8. 开源的代理服务器HAProxy 易遭严重的 HTTP 请求走私攻击
  9. Linux查看系统版本命令 linux学习教程
  10. Caffe傻瓜系列(10):draw_net.py绘制caffe net结构
  11. 【kuangbin专题】Manacher
  12. [Hadoop]-Yarn-调度器篇
  13. 【软件相关】Multisim完整教程
  14. 【电商数仓】数仓即席查询之Kylin简介,安装和使用
  15. 芯动科技面试——数字IC/FPGA面试案例总结1
  16. 爬虫取中间文本_【实战No.2】1小时打造你自己的网络爬虫
  17. matlab 神经网络设计多层隐含层_[rbf神经网络]请教关于MATLAB中RBF神经网络隐含层神经元个数的问题...
  18. 逆向工程实验——pre9(可执行文件的加密MD5碰撞lab)
  19. 【LeetCode 1125】 Smallest Sufficient Team
  20. C++ 与cocos2d-x-4.0完成太空飞机大战 (二)

热门文章

  1. jsp界面自动生成文件注释_实施注释界面
  2. findfirst_当心findFirst()和findAny()
  3. java8 从数组获取流_从数组到流再到Java 8
  4. java8 函数式编程_使用Javaslang进行Java 8中的函数式编程
  5. java8升级java12_为什么现在是升级到Java 8的最佳时机
  6. observable_在Completablefuture和Observable之间转换
  7. 您需要了解的有关UI测试的所有信息
  8. q7goodies事例_Java 8 Friday Goodies:精益并发
  9. spring 事务持久性_项目学生:Spring数据的持久性
  10. Spring-Boot 2.1.x和主要的bean定义