Java Spring@Transactional并发

Java Spring@Transactional并发,java,spring,transactions,concurrency,synchronization,Java,Spring,Transactions,Concurrency,Synchronization,类MyService{ 公共图书馆a(){ 已同步(somekey){ b(); } } @事务性(传播=传播。需要\u新建) 公共空间b(){ …数据库工作吗。。。 } } 我的目标是 1-拿到钥匙 2-启动事务 3-提交事务 4-释放钥匙 当我从外部调用()方法时,事务不起作用 有什么建议吗 谢谢。我对钥匙的性质很好奇。为什么服务会生成它?难道不是另一种设计会把它放进数据库吗 如果没有错误信息,很难准确地判断出问题所在。不是100%确定。我认为所有@Transactional调用都必须在启


类MyService{

公共图书馆a(){ 已同步(somekey){ b(); } }

@事务性(传播=传播。需要\u新建) 公共空间b(){ …数据库工作吗。。。 } }

我的目标是

1-拿到钥匙 2-启动事务 3-提交事务 4-释放钥匙 当我从外部调用()方法时,事务不起作用

有什么建议吗


谢谢。

我对钥匙的性质很好奇。为什么服务会生成它?难道不是另一种设计会把它放进数据库吗


如果没有错误信息,很难准确地判断出问题所在。

不是100%确定。我认为所有@Transactional调用都必须在启动事务的同一线程上完成。我肯定地知道,@Transactional不能跨线程工作。(我猜是出于设计)

除非您使用代码编织,否则这是行不通的

Spring处理事务的默认方式是通过。对事务方法的调用如下所示:


class MyService {

public void a() { synchronized(somekey) { b(); } }

@Transactional(propagation = Propagation.REQUIRES_NEW) public void b() { ...do DB works... } } 如果在同一对象上调用另一个方法,则不会通过代理,因此不存在事务行为

 caller --> ProxyClass.a() --> YourClass.a()

如果您不想使用AspectJ,您可以使用来获取代理对象。

如果您想在
a()
内部调用
b()
,并且您想使
b()
具有事务性,您必须将其放入单独的类中。

对b()的方法调用是内部调用,而不是Henning所说的对事务性代理的调用


整个事情都在博文中解释。

什么是“不起作用”呢?异常和错误消息会很有帮助;只是事务没有启动,每个插入操作都直接进入数据库。您是如何配置您的事务管理器的?没有错误;只是事务并没有启动,每个插入操作都直接进入数据库。而且数据库可能会根据位置(客户)而变化,所以我只想在Java端解决它。
 caller --> ProxyClass.a() --> YourClass.a() --> YourClass.b()