当前位置: 首页 > 知识库问答 >
问题:

如何在多线程环境中使用@Transactional

苗森
2023-03-14

我正在使用多线程执行插入操作。我使用了带注释的方法,我的方法是@Transaction注释。但我无法执行插入操作,导致出现以下异常。

异常线程"Thread-21"javax.persistence.Transaction必需异常:在org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:96)在sun.reflect.NativemetodAccessorImpl.invoke0(本机方法)在sun.reflect.NativemetodAccessorImpl.invoke(NativemetodAccessorImpl.java:62)执行更新/删除查询

共有2个答案

夏才
2023-03-14

因为spring Bean是包装的,所以必须从线程调用包装的方法:

@Autowire
private final MyService ms=null;

public void removeMultithreaded(int[] userIds){
  for(int i =0; i< userIds.length; i++) {
    int userId=userIds[i];
    new Thread(()-> ms.delete(userId)).start();
  }
}

在这段代码中,您调用删除必须由@Transactional注释的内容。

请注意:您可以同时删除的用户名数量受连接池大小的限制!由于删除操作可能比从连接池中收集和释放用户更快,因此即使您必须删除的用户数量高于连接池允许的数量,您也可能永远不会遇到问题。

唐弘益
2023-03-14

因为没有代码...为了让它工作,你必须

  1. 用@Transactional注释你的delete方法,我们称之为delete
  2. 该方法的调用必须从bean外部进行,以便AOP启动

所以内部调用就像

void doSomething(){
    this.delete();
}

行不通

但是

@Autowired
YourBean bean;

...
bean.delete(); 

我会做好的

 类似资料:
  • 问题内容: 我正在开发一个项目,在该项目中,我需要对正在运行的服务器进行HTTP URL调用,该服务器将响应作为JSON字符串返回。 下面是我的主要代码,它使用和- 下面是我的类,它实现接口并使用… 现在我有下面的代码在另一大类它调用的方法类顺序- 所以我的问题是在这里应该是静态的,就像我正确看到的一样,我正在为每个请求重新创建整个连接池,而我猜这不是正确的方法。 注意: 如果我将RestTemp

  • 我正在做一个项目,在这个项目中,我需要对运行

  • 问题内容: 典型的(对于x86-64平台和Linux OS)是在开始时幼稚地锁定互斥锁并在完成后将其释放,还是以更巧妙的方式将互斥锁锁定在更精细的级别,从而减少了锁争用?如果确实采用第二种方法,那么该如何做? 问题答案: 经营多个分配 场所 。每个竞技场都有自己的锁。当线程需要分配内存时,选择一个竞技场,将其锁定,然后从中分配内存。 选择竞技场的机制有些复杂,旨在减少锁争用: 考虑到这一点,基本上

  • 关于Spring WebClient我有一个问题 在我的应用程序中,我需要做许多类似的API调用,有时我需要更改调用中的头(身份验证令牌)。所以问题来了,在这两个选择中,什么更好: > 为所有传入的MyService.class请求创建一个WebClient,方法是将其设置为字段,如下代码所示: 谢谢你。

  • 问题内容: 一段时间以来,我一直在多线程环境中使用HttpClient。对于每个线程,当它启动连接时,它将创建一个全新的HttpClient实例。 最近,我发现使用这种方法可能导致用户打开太多端口,并且大多数连接处于TIME_WAIT状态。 http://www.opensubscriber.com/message/commons-httpclient- dev@jakarta.apache.or

  • 我的程序使用ZMQ进行通信。也就是说,服务器(C、linux)创建一个XPUB套接字,然后在一个线程中读取它,在另一个线程中发布数据(写入)。 客户端(java、jzmq、linux)创建一个SUB套接字,并订阅使用它。 一段时间后,服务器端在读取线程中接收SIGABRT。 什么可能是问题的根源?在不同的线程中读/写或创建XPUB/SUB对? 如果问题是在多线程中,那么使用XPUB套接字的正确范例