Spring @Transactional 并发

Alt*_*tug 2 java concurrency spring synchronization transactions


class MyService {

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

@Transactional(propagation = Propagation.REQUIRES_NEW) public void b() { ...do DB works... } }

Run Code Online (Sandbox Code Playgroud)

我的目标是

    1 - 拿到钥匙
    2 - 开始交易
    3 - 提交事务
    4 - 松开钥匙

当我从外部调用 a() 方法时,事务不起作用。

有什么建议 ?

谢谢。

Hen*_*ing 5

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

Spring 处理事务的默认方式是通过AOP 代理。对事务方法的调用是这样的:

 caller --> ProxyClass.a() --> YourClass.a()
Run Code Online (Sandbox Code Playgroud)

如果你在同一个对象上调用另一个方法,你不会通过代理,所以没有事务行为。

 caller --> ProxyClass.a() --> YourClass.a() --> YourClass.b()
Run Code Online (Sandbox Code Playgroud)

如果不想使用 AspectJ,可以使用AopContext.currentProxy().