首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧事务内件

弹簧事务内件
EN

Stack Overflow用户
提问于 2011-12-23 05:14:35
回答 3查看 3.4K关注 0票数 6

情况如下:

  1. Method1有四种数据库更新方法。Method1使用Spring事务管理语义进行注释。
  2. Method2中有一个数据库读取方法,并且在Method1完成其所有数据库更新后调用它。Method2还使用Spring事务语义进行注释。
  3. 这里有一个web请求,控制器拦截请求,然后调用method1,然后调用method2。
  4. 一个事务也被包裹在网络请求周围。

我想知道的是:

1. Spring如何知道如何在成功的事务上提交数据库更新?对执行事务管理的Spring实现有什么参考吗?

2.由于我们有一个事务的层次结构:围绕web的事务--请求->与Propagation=RequestNew进行的事务处理方法1->与Propagation=Required for Method2进行事务处理,那么Spring如何进行事务管理以确保在正确的上下文中以正确的顺序执行事务?

简而言之,通过播放来了解Spring是如何在其所有最具体的细节中执行事务管理的,或者引用文档,而不是简单地以JTA或其他缩略语为中心的解释,这将是非常棒的。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-23 13:20:55

让我们来做一些基本的陈述。

  1. 事务性上下文是将某些特殊属性(数据库会话)提供给应用程序运行时(否则是不可用的)的环境。事务上下文通常用于对事务进行作用范围。
  2. Spring使用、AOP代理和XML元数据来实现声明性事务管理。
  3. 注释用于标记特定方法的事务传播行为。
  4. Spring使用拦截器机构对方法应用事务。

这里我重复使用上面@stacker给出的示例

代码语言:javascript
复制
MyClass{

    @Transactional
    public void sequence() {
      method1();
      method2();
    }

    @Transactional
    void method1() {
    }

    @Transactional(propagation=Propagation.REQUIRES_NEW)
    void method2() {
    }

}

您还可以使用xml配置实现相同的功能。让我们把它当作它的流行和广泛使用。

在部署时

  • Spring框架检查xml文件(著名的applicationContext.xml),并根据配置扫描代码中的@Transactional注释(假设配置是基于注释的)。
  • 之后,它为标记为事务的方法生成AOP代理。简单地说,这些代理只不过是相关方法的包装器。
  • 在这些包装器方法中,还根据配置(即事务传播)生成事务顾问代码之前和之后的代码。
  • 现在,当调用这些包装器方法时,Transaction将在实际方法调用之前和之后显示。。
  • 在上面的示例中用伪代码表示相同 ProxyMyClass{ MyClass类;。。sequence(){ //Transaction代码(通常开始/检查事务) myclass.sequence();//Transaction代码(通常是回滚/提交)}。。。}

spring就是这样管理事务的。不过,有点过于简单化了。

现在回答你的问题,

.How知道如何在成功的事务上提交数据库更新吗?对执行事务管理的Spring实现有什么参考吗?

每当您调用事务下的方法时,实际上调用一个代理,它首先执行事务顾问(这将开始事务处理),然后调用实际的业务方法,一旦完成,将执行另一个事务顾问(这取决于返回的方法,将提交或回滚事务)。

由于我们有一个事务的层次结构:围绕web的事务-请求->事务与Propagation=RequestNew进行的方法1->事务与Propagation=Required for Method2的事务,那么Spring如何进行事务管理以确保事务在适当的上下文中以正确的顺序执行?

在事务层次结构的情况下,spring框架生成相应的事务顾问检查。举你提到的例子,

  • 对于method1 (RequestNew )事务,事务高级程序代码(或事务通知)总是要创建一个新事务。
  • 对于method2 (必需),事务顾问代码(或事务通知)将检查现有事务并在存在时使用该事务,否则将创建新事务。

有一个图片显示在spring文档页面上。,它很好地总结了这些方面。

希望这能有所帮助。

票数 11
EN

Stack Overflow用户

发布于 2011-12-23 07:26:25

代码语言:javascript
复制
Controller
@Transactional
public void sequence() {
  method1();
  method2();
}

@Transactional
void method1() {
}

@Transactional(propagation=Propagation.REQUIRES_NEW)
void method2() {
}

默认传播是必需的(支持当前事务,如果不存在则创建一个新事务)。因此,m1将使用在Controller中启动的事务。m2被注释为REQUIRES_NEW (创建新事务,如果存在当前事务,则挂起当前事务)。事务的顺序是您调用事务性方法的顺序。

代码语言:javascript
复制
Controller
begin tx1
   |--------------------> m1 (uses tx1)
   |
   | begin tx2
   |--------------------> m2 (uses tx2)
   | commit tx2
commit tx1
票数 4
EN

Stack Overflow用户

发布于 2011-12-23 07:32:38

你读过春季文献吗?基本上,AOP用于管理事务。您还应该阅读AOP文档。如果AOP文档还不够,我建议您查看代码。在调试模式下使用断点执行代码将是很好的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8612486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档