Spring @Transactional concurrency

巧了我就是萌 提交于 2019-12-09 23:11:12

问题



class MyService {

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

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

My aim is

    1 - get the key
    2 - start transaction
    3 - commit transaction
    4 - release the key

When i call a() method from outside, transaction doesn't work.

Any suggestions ?

Thanks.


回答1:


Unless you're using code weaving, this can't work.

The default way Spring handles transactions is through AOP proxies. The call to a transactional method goes like this:

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

If you call another method on the same object, you're not going through the proxy, so there is no transactional behaviour.

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

If you don't want to use AspectJ, you can get the proxy object using AopContext.currentProxy().




回答2:


Not 100% sure. I think all @Transactional calls must be done on the same thread that a transaction started on. I know for certain that @Transactional doesn't work across threads. (I guess by design)




回答3:


I'm curious as to the nature of the key. Why is the service generating it? Wouldn't an alternative design put that in the database?

It's hard to tell exactly what's wrong without an error message.




回答4:


If you want to call b() inside of a(), and you want to make b() transactional, you have to put it into separate class.




回答5:


Method call to b() is internal call not on transactional proxy as said by Henning.

Whole thing is explained in this blog post.



来源:https://stackoverflow.com/questions/3708449/spring-transactional-concurrency

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!