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()