当前位置: 移动技术网 > IT编程>开发语言>Java > Spring JPA事务

Spring JPA事务

2019年09月05日  | 移动技术网IT编程  | 我要评论
Subversion本身有很好的扩展性,用户可以通过钩子实现一些自定义的功能。所谓钩子实际上是一种事件机制,当系统执行到某个特殊事件时,会触发我们预定义的动作,这样的特殊事件在Subversion里有很多。那么SVN的钩子有哪些呢 ...

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.

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网