标签: transactional

Spring Bean 使用 @Transactional 挂在方法上

只是一点背景,我是一个新的开发人员,最近在高级开发人员离开公司之后接手了一个重大项目,然后我才完全了解他是如何构建这个项目的。我会尽力解释我的问题。

此应用程序创建多个 MessageListner 线程以从 JMS 队列读取对象。接收到对象后,数据将根据某些业务逻辑进行操作,然后映射到持久性对象以使用休眠 EntityManager 保存到 oracle 数据库中。

直到几周前,自从我加入这个项目以来,这个配置在过去一年左右的时间里还没有出现任何重大问题。但是对于其中一个队列(问题与此特定队列隔离),处理接收到的对象的 spring 托管 bean 挂在下面的方法中。我的调试使我得出结论,它已完成方法中的所有内容,但在完成时挂起。经过数周的尝试解决这个问题,我对这个问题束手无策。对此的任何帮助将不胜感激。

由于每个 MessageListner 都有自己的处理器,因此这种挂起方法只影响一个队列上的传入数据。

@Transactional(propagation = Propagation.REQUIRES_NEW , timeout = 180)
 public void update(UserRelatedData userData, User user,Company company,...)
 { 
   ...
   ....
   //business logic performed on user object
   ....
   ......
   entityMgr.persist(user);

   //business logic performed on userData object
   ...
   ....
   entityMgr.persist(userData);

   ...
   ....

   entityMgr.flush();

}
Run Code Online (Sandbox Code Playgroud)

我插入调试语句只是为了遍历该方法,它完成了包括 entityMgr.flush.() 在内的所有内容。

spring jpa transactional propagation

5
推荐指数
2
解决办法
5746
查看次数

Spring Batch 中的作业级事务性

我现在知道 Spring-Batch 中没有步骤间事务性这样的东西。我正在开发一个复杂的批处理作业,其中有许多步骤在数据库中执行多个操作,并且每个步骤都与其他步骤相关,这样每个步骤都属于同一个事务。我理解 Spring-Batch 范式的方式我必须使用一步工作来实现事务性。是否有任何想法(或任何其他方式)在最近或未来的版本中具有某种工作级别的事务性?

Edit1:我在这个链接6.3.1 点中找到了一种连接多个处理器的方法,但这不能满足我当前的需求。

Edit2:this other link建议我使用带有“@Transactional”注释的信封类的可能性,该类将调用我的工作,因此应该有一个外部事务。

transactional spring-batch

5
推荐指数
1
解决办法
3591
查看次数

Hibernate 验证和 Spring 控制器的一项事务

我正在尝试为 Rest API 实现注册控制器。我已经阅读了很多关于放置@Transactional 的内容。(不是在 DAO 级别,而是在可能编排的服务)。在我的用例中,我不仅需要服务,还需要休眠验证来使用相同的事务。

这是控制器的代码:

@Autowired
private UserService userService;

@RequestMapping(method = RequestMethod.GET)
@ResponseBody
@Transactional
public DefaultResponse register(@Valid RegisterIO registerIO, BindingResult errors) {
    DefaultResponse result = new DefaultResponse();

    if (errors.hasErrors()) {
        result.addErrors(errors);
    } else {
        userService.register(registerIO);
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

我编写了一个自定义约束注释,它验证参数 registerIO 的属性。两者,这个验证器和 userService.register(registerIO); 访问数据库(检查电子邮件地址是否已被使用)。

因此我希望这两种方法都使用相同的 Hibernate 会话和事务。

这种方法导致以下异常:

org.hibernate.HibernateException: No Session found for current thread
org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:941)
Run Code Online (Sandbox Code Playgroud)

问题是@Transactional 注释。当我将此注释放在调用数据库的方法上时,一切正常,但两个事务都开始了。我怀疑当我将它放在 register 方法中时,在 @Transactional 启动此方法的事务之前执行休眠验证。

我开发了以下功能解决方法,但我对此并不满意。此代码不使用 @Valid 注释而是自行调用验证器:

@RequestMapping(method = RequestMethod.GET)
@ResponseBody
@Transactional
public DefaultResponse register( RegisterIO registerIO, BindingResult …
Run Code Online (Sandbox Code Playgroud)

java spring-mvc transactional hibernate-validator hibernate-4.x

5
推荐指数
1
解决办法
1403
查看次数

Spring JpaRepository 自定义实现是否自动事务处理?

一切都在标题中......

我有一个JpaRepository<User, Long>使用其他自定义方法扩展的存储库,遵循http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/jpa.repositories.html 中描述的模式

Spring 文档说:默认情况下,存储库实例上的 CRUD 方法是事务性的。对于读取操作,事务配置 readOnly 标志设置为 true,所有其他操作都使用普通的 @Transactional 进行配置

  • 这是否适用于自定义方法?有交易吗?
  • 进阶:我在哪里可以自己找到答案?(即哪个类的 Spring 框架负责生成动态代理和装饰调用?)

先感谢您!

spring repository transactional

5
推荐指数
1
解决办法
1484
查看次数

如何在@Transactional“READ_UNCOMMITTED”中设置隔离级别。我正在使用 EclipseLink 2.5.1-RC1

我需要在正在进行的事务中启动新事务,以便第二个事务中的异常只会回滚新事务而不是旧事务。

这是我通过在第二个事务中设置传播属性来做的,如下所示:

@Transactional(传播 = 传播.REQUIRES_NEW)

这创建了一个新事务,但新事务需要读取第一个事务的一些未提交数据(脏读),并更新该数据。我试图通过将隔离属性设置为:

@Transactional(propagation = Propagation.REQUIRES_NEW,isolation=Isolation.READ_UNCOMMITTED)

这将引发异常 - InvalidIsolationLevelException,表示“标准 JPA 不支持自定义隔离级别 - 为您的 JPA 实现使用特殊的 JpaDialect”。

任何人都可以帮助我实施 JpaDialect 吗?我正在使用 Eclipse Link 2.5.1 。

或者我可以在开始新交易之前如何关闭第一笔交易?由于第一个事务已关闭,因此第二个事务读取第一个事务提交的数据没有问题。

jpa transactional eclipselink transaction-isolation read-uncommitted

5
推荐指数
1
解决办法
1万
查看次数

@Transactional,方法内的方法

我有一个带有调用另一种方法的方法的服务。在第一种方法中,我只使用 SELECT 执行查询,但他们必须查看在第二种方法中完成的 INSERTS 和 UPDATES。

然后,我必须处理交易。我正在使用 Spring,所以我可以使用 @Transactional 注释。

以下哪个选项似乎更适合您?

选项 A

@Transactional
public void generate(){
    // selects
    save(a);
    // more selects
}

@Transactional
public void save(Object a){
    //save the object
}
Run Code Online (Sandbox Code Playgroud)

选项 B

public void generate(){
    // selects
    save(a);
    // more selects
}

@Transactional
public void save(Object a){
    //save the object
}
Run Code Online (Sandbox Code Playgroud)

谢谢!!

java spring jpa transactional

5
推荐指数
1
解决办法
9955
查看次数

Spring引导2 @Transactional注释使Autowired字段为空

我试图@Transactional在我的服务的方法中使用注释来懒洋洋地加载一个字段.但是,@Transactional在我的Implementation类上使用会生成所有自动装配的字段null.

这是我的实现:

@Service
public class UserServiceImpl implements UserService {

 /**
  * DefaultMapper.
  */
 @Autowired
 private DefaultMapper defaultMapper;

 /**
  * Resource service injection.
  */
 @Autowired
 private ResourceService resourceService;

 /**
  * UserRepository.
  */
 @Autowired
 private UserRepository userRepository;

 /**
  * Jwt Factory.
  */
 @Autowired
 private JwtService jwtService;

 @Override
 @Transactional
 public final UserDto findByLogin(final String login) throws ResourceNotFoundException {
 // user repository is null here when using @Transactional
  User user = this.userRepository.findByLogin(login)
   .orElseThrow(() -> new ResourceNotFoundException(
    resourceService.getMessage(MessageBundle.EXCEPTION, "resource.notfound.user.login") …
Run Code Online (Sandbox Code Playgroud)

java spring transactional autowired spring-boot

5
推荐指数
1
解决办法
936
查看次数

@Transactional 注解是否避免并发访问业务层方法

我对@Transactional 注释在业务/服务层的使用有点不清楚。

我的问题是,当在业务层中与ISOLATION_SERIALIZABLE一起使用时,@Transactional注解是否保证不允许对特定方法进行并发访问?

@Transactional(isolation = Isolation.SERIALIZABLE)
public void businessMethod() {

    // calls subBusinessMethod
    subBusinessMethod();
    ---------------
    ---------------
    ---------------

}
Run Code Online (Sandbox Code Playgroud)

想象一下subBusinessMethod调用 DAO 层来做一些数据库事务。调用之后的代码执行(可能会有更多的 db 调用)subBusinessMethod取决于subBusinessMethod.

我需要确保对 的后续调用businessMethod不应该调用 dao 层从/向数据库读/写,而不知道先前调用的 db 表发生了什么。已在业务逻辑中添加了必需的验证。

首先,我的方法有效吗?如果是这样,我是否以正确的方式使用它。?

java spring hibernate transactions transactional

5
推荐指数
1
解决办法
455
查看次数

Spring @Retryable 与有状态的 Hibernate 对象

我正在尝试使用 Springs @Retryable 使我的服务方法在失败时重试。

@Retryable(backoff = @Backoff(delay = 1000), maxAttempts = 3)
@Transactional(rollbackFor = Throwable.class)
public Something saveSomething(Something something) {
  //some logic and saving
}
Run Code Online (Sandbox Code Playgroud)

问题是,在保存某物对象后出现异常。所以事务被回滚并再次调用方法。不同之处在于,something-object 的 id 不再是 null,而是它从 Hibernate 之前的保存过程中获得的值,因此在第二次尝试中,Hibernate 不会保存该对象,而是尝试更新它。由于数据库中没有条目,因此更新不执行任何操作,并且对象不会持久保存到数据库中。

认识到这一点后,我尝试将 @Retryable 的 stateful 属性设置为 true:

@Retryable(backoff = @Backoff(delay = 1000), maxAttempts = 3, stateful = true)
@Transactional(rollbackFor = Throwable.class)
public Something saveSomething(Something something) {
  //some logic and saving
}
Run Code Online (Sandbox Code Playgroud)

但是使用该配置 saveSomething() 只调用一次,而 der 不是第二次尝试。

有没有人建议解决这个问题?

java spring hibernate transactional spring-retry

5
推荐指数
1
解决办法
1358
查看次数

如何在Spring Boot中使用@Transactional批注

我正在做一个春季启动项目。

@Transactional项目中使用注释之前,我有两个问题

  1. @Transactional在spring-boot,服务层或DAO层中使用注释的最佳实践?

  2. 如果是服务层,那么我应该@Transactional在类或该类中的方法上使用注释?

java database annotations transactional spring-boot

5
推荐指数
1
解决办法
434
查看次数