情况如下:
我想知道的是:
1. Spring如何知道如何在成功的事务上提交数据库更新?对执行事务管理的Spring实现有什么参考吗?
2.由于我们有一个事务的层次结构:围绕web的事务--请求->与Propagation=RequestNew进行的事务处理方法1->与Propagation=Required for Method2进行事务处理,那么Spring如何进行事务管理以确保在正确的上下文中以正确的顺序执行事务?
简而言之,通过播放来了解Spring是如何在其所有最具体的细节中执行事务管理的,或者引用文档,而不是简单地以JTA或其他缩略语为中心的解释,这将是非常棒的。
谢谢
发布于 2011-12-23 13:20:55
让我们来做一些基本的陈述。
这里我重复使用上面@stacker给出的示例
MyClass{
@Transactional
public void sequence() {
method1();
method2();
}
@Transactional
void method1() {
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
void method2() {
}
}您还可以使用xml配置实现相同的功能。让我们把它当作它的流行和广泛使用。
在部署时
applicationContext.xml),并根据配置扫描代码中的@Transactional注释(假设配置是基于注释的)。spring就是这样管理事务的。不过,有点过于简单化了。
现在回答你的问题,
.How知道如何在成功的事务上提交数据库更新吗?对执行事务管理的Spring实现有什么参考吗?
每当您调用事务下的方法时,实际上调用一个代理,它首先执行事务顾问(这将开始事务处理),然后调用实际的业务方法,一旦完成,将执行另一个事务顾问(这取决于返回的方法,将提交或回滚事务)。
由于我们有一个事务的层次结构:围绕web的事务-请求->事务与Propagation=RequestNew进行的方法1->事务与Propagation=Required for Method2的事务,那么Spring如何进行事务管理以确保事务在适当的上下文中以正确的顺序执行?
在事务层次结构的情况下,spring框架生成相应的事务顾问检查。举你提到的例子,
有一个图片显示在spring文档页面上。,它很好地总结了这些方面。

希望这能有所帮助。
发布于 2011-12-23 07:26:25
Controller
@Transactional
public void sequence() {
method1();
method2();
}
@Transactional
void method1() {
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
void method2() {
}默认传播是必需的(支持当前事务,如果不存在则创建一个新事务)。因此,m1将使用在Controller中启动的事务。m2被注释为REQUIRES_NEW (创建新事务,如果存在当前事务,则挂起当前事务)。事务的顺序是您调用事务性方法的顺序。
Controller
begin tx1
|--------------------> m1 (uses tx1)
|
| begin tx2
|--------------------> m2 (uses tx2)
| commit tx2
commit tx1发布于 2011-12-23 07:32:38
你读过春季文献吗?基本上,AOP用于管理事务。您还应该阅读AOP文档。如果AOP文档还不够,我建议您查看代码。在调试模式下使用断点执行代码将是很好的。
https://stackoverflow.com/questions/8612486
复制相似问题