@异步和奇怪的交易竞争条件

时间:2019-11-07 12:08:18

标签: spring jpa asynchronous transactions

我有一些@Async方法。作为此方法的参数,我传递了一些具有延迟加载的User实体的entity(Action)。我很少遇到问题,无法访问“用户角色”字段(我只能有一个角色)。我试图通过直接传递User实体来解决它。有时仍然无法正常工作。我猜这是因为实体只是代理,如果基础会话/事务发生某些情况,有时代理会被破坏。

我了解到事务不会传播到@Async方法。怎么回事,有时User实体已初始化(有角色),有时没有初始化。我试图挂起@Async方法并让主线程完成,以便事务将被关闭,并且我将始终遇到错误。这没有发生。

怎么回事?我真的很怀疑实体上使用的@LastModifiedBy,它可能在那里做了一些魔术。

无论如何,解决方案是使@Async具有事务性,但我有点紧张,因为我无法模拟此错误,因此无法稍后对其进行正确修复。

@Entity
@Table(name = "ACTION")
public class Action {
 ...
 @LastModifiedBy
 @ManyToOne(optional = false, fetch = FetchType.LAZY)
 @JoinColumn(name="modified_by_user_id")
 private User modifiedBy;

和方法

  @Async
  public void async(User modifiedBy) {
    modifiedBy.getRole(); //sometimes fails

当前,当直接传递用户时

 java.lang.InternalError: Marking a ResultSet inactive that we did not know was opened!
    ...
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:156) [hibernate-core-5.1.0.Final.jar:5.1.0.Final]
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:260) [hibernate-core-5.1.0.Final.jar:5.1.0.Final]
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:68) [hibernate-core-5.1.0.Final.jar:5.1.0.Final]
    at model.entity.User_$$_jvst33f_8.getRole(User_$$_jvst33f_8.java) [classes:]
    ...

0 个答案:

没有答案