首页
学习
活动
专区
圈层
工具
发布

应用服务器的分布式事务支持和Seata的对比分析

应用模块拆分 应用按照业务模块进一步拆分,每一个模块都作为EJB,部署在独立的应用服务器中。完成一个业务请求会跨越多个应用服务器节点和资源,如何在这种场景保证业务操作的事务呢?...当访问入口EJB时JTA会自动开启全局事务,事务上下文随着EJB的远程调用在应用服务器之间传播,让被调用的EJB也加入到全局事务中。...Transaction Manager (TM): 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。...Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。 Seata vs....RM需要拦截并解析SQL,生成回滚语句,在事务rollback时自动进行数据还原。XAResource是对XA driver的包装,资源参与分布式事务的能力,都是由数据库提供的。

34710

Spring声明式事务、编程式事务一文打尽

这两种类型的事务管理的差异在于: 不像EJB CMT是绑定了JTA的。...尽管EJB容器默认行为是在事务发生系统异常(通常是运行时异常)时自动回滚,EJB CMT并不会在出现应用异常时自动回滚。但是Spring声明式事务的默认行为是允许自定义异常变更回滚策略的。...Spring框架事务基础结构代码会捕获任何没有处理的异常因为它会从堆栈中冒泡出来从而决定是否标记该事务需要回滚。...InstrumentNotFoundException"/> 当Spring事务框架基础结构捕获一个异常时...一个相应的UnexpectedRollbackException异常会被抛出。这是所期望的行为,因此事务调用者永远不会被误导,以为提交是在实际没有执行的情况下执行的。

1.3K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java事务管理

    'B'"); // 提交事务 conn.commit(); // 事务提交:转账的两步操作同时成功 } catch (SQLException e) { try { // 发生异常,回滚在本事务中的操做...JTA只提供接口,没有具体的实现,需要J2EE服务提供商根据JTS规范提供,常见的JTA实现方式: J2EE容器提供的JTA实现(如JBOSS) 独立的JTA实现:如JOTM、Atomikos。...(如Tomcat、Jetty以及普通的java应用) JTA提供了 java.transaction.UserTransaction,里面定义了下面的方法: begin:开启一个事务 commit:提交一个事务...rollback:回滚一个事务 setRollBackOnly:把当前事务标记为回滚 setTransactionTimeout:设置事务的时间,超过这个时间,就抛出异常,回滚事务 另外,不是使用了UserTransaction...Transaction) 一个事务管理器(Transaction) 1.3 容器事务 容器事务主要是J2EE应用服务提提供的,容器事务大多基于JTA实现,是基于JNDI的,相当复杂的API实现 EJB

    95640

    面向面试编程连载(一)

    作为一种由Spirng容器托管的通用模式组件,任何被@Component标准的组件均为组件扫描的候选对象.类似的,凡是被@Component原标注的注解,如@Service,任何组件标注它时,也将被是做组件扫描的候选对象...脏读:一个事务读取到另一个事务修改但还未提交的数据 不可重复读:一个事务读取数据之后,该数据被其他事务修改,此时第一个事务读取到的事务就是错误的(强调修改) 幻读:一个事务读取了某些数据,没提交再读取时数据多了或者少了...}; /** * 略 */ String[] rollbackForClassName() default {}; /** * 如果配置这个 如果抛出此异常将不会回滚...* 使用外围事务,若外围无事务则抛出异常 */ MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY), /...* 非事务执行,当外围有事务则抛出异常 */ NEVER(TransactionDefinition.PROPAGATION_NEVER), /** *

    92050

    关于Spring的事务Transactional,锁同步,并发线程Spring事务传播机制和数据库隔离级别

    org.springframework.jdbc.datasource.DataSourceTransactionManager 通过创建Savepoint实现嵌套事务,达到内层事务若抛出异常...会抛出异常,method2()也会被回滚; 如果method2()用PROPAGATION_REQUIRES_NEW: ``` ServiceB{ @Transactional(propagation...Propagation.PROPAGATION_REQUIRES_NEW) public void method2(){ xxxxxx } } ``` 那么method2不会因为method1抛出异常而回滚...不管是什么类型的嵌套事务,一个线程只有一个事务,线程结束的时候才提交事务,包括嵌套事务,即使嵌套事务是REQUIRES_NEW,也不是嵌套事务的方法结束就提交事务的,一定是等到外部事务方法结束,整个线程结束才一起提交的...如果事务加在外部方法A,在内部方法里面有synchronized代码块B,那么当B执行完时,事务还未提交,其他线程进入synchronized代码块B后,读取的库存数据不是最新的。

    1.7K30

    重点来了:事务一致性的深入研究&EJB的全生命周期 | 从开发角度看应用架构5

    此API为应用程序中的提交和回滚事务提供了一个方便的高级界面。例如,如果Java持久性API(JPA)与JTA一起使用,则开发人员不必在应用程序源码中编写跟踪SQL提交和回滚语句。...JTA有两种不同的方式来管理Java EE中的事务: 隐式/容器管理事务(Implicit or Container Managed Transaction:CMT):应用程序服务器管理事务边界并自动提交和回滚事务...四、隐式事务管理,又称容器管理事务(CMT) 在CMT中,应用程序服务器隐式地在EJB方法开始时开始事务、并在方法结束时提交事务,除非出现错误或异常。...这用于在此EJB中开始,提交和回滚事务。 4Begin开始交易。 5如果所有方法都没有任何错误地成功执行,请提交事务。 6如果由于某种故障而出现异常,请执行回滚事务。...@Resource告诉容器分配一个新的事务对象并在运行时将其注入到这个EJB中。 ? 添加以下代码以提交事务: ? 添加以下代码以在发生异常时回滚事务: ? 接下来,启动EAP: ?

    1K40

    JavaEE - JPA(2):EJB中的事务管理

    下面就来看看这个注解定义了那些可选项: MANDATORY: 运行当前方法时要求存在处于active状态的事务。如果没有active状态的事务则会抛出异常。...NEVER: 当运行的当前方法采用此选项时,如果运行时发现有active状态的事务,那么会直接抛出一个异常。 在上面的各种选项中,出现了事务的创建以及挂起。...如果在执行一个带有事务的方法时没有发生异常,那么在该方法结束的时候,容器就会将该事务提交。...如果需要立即中断后续代码的执行,可以采取抛出异常的方式。...在使用UserTransaction完成事务的操作时,一定需要注意合理处理各种编译时异常。尽管这些异常的种类确实是有些多,这也是为什么提倡使用CMT而非BMT的原因之一吧。

    1K10

    判断事务是否提交成功(Java)

    分布式事务解决方案 对于更复杂的分布式事务场景,开发者可能需要使用如两阶段提交(2PC)或三阶段提交(3PC)等协议,或者使用更现代的解决方案如Saga模式。...使用JDBC 在JDBC中,可以通过检查Connection对象的commit方法是否抛出异常来判断事务是否提交成功。...如果commit方法执行成功,那么事务提交成功;如果抛出异常,则需要执行回滚操作。...Spring会自动处理事务的提交和回滚。如果被@Transactional注解的方法正常执行结束,Spring会提交事务;如果方法执行过程中抛出了运行时异常,Spring会回滚事务。...事务提交失败的处理 事务提交失败时,应该进行适当的错误处理和回滚操作,以保证数据的一致性。在JDBC中,这通常涉及到捕获SQLException并调用rollback方法。

    27900

    Java EE应用服务器的事务管理

    分布式事务处理具有更高的复杂性,需要协调和管理跨越不同系统的事务。这样的事务处理通常需要遵循分布式事务处理的规范和算法,如两阶段提交协议。...事实上,启发式决策违反了两阶段提交协议的承诺,因此,做出启发式决策只是用于摆脱灾难性的情况,而不是常规使用。 JTA 定义了几种与启发式决策有关异常。...javax.transaction.HeuristicMixedException 是最糟糕的启发式异常。抛出它表示事务的一部分已提交,而其他部分被回滚。...当一些事务参与者进行启发式提交,而其他事务参与者进行启发式回滚时,coordinator会抛出此异常。...一些 CORBA 服务,如 CORBA 命名服务、CORBA 事务和 CORBA 安全,被 Java EE 标准所接受,作为创建可互操作的 EJB 服务的手段。

    49810

    并发下的事务处理

    PS:大多数数据库都是使用提交读。作为默认的隔离级别,如Oracle、SqlServer。 由于在数据量訪问的情况下,这样的方式性能较好,同一时候防止了脏读的情况发生。...假设ServiceB.methodB失败回滚,假设他抛出的异常被ServiceA.methodA捕获。ServiceA.methodA事务仍然可能提交。 5....在JTA 中,事务管理器抽象为javax.transaction.TransactionManager接口。并通过底层事务服务(即JTS)实现。...像非常多其它 的java规范一样,JTA只定义了接口,详细的实现则是由供应商(如J2EE厂商)负责提供。...眼下JTA的实现主要由下面几种: 1.J2EE容器所提供的JTA实现(JBoss) 2.独立的JTA实现:如JOTM,Atomikos.这些实现能够应用在那些不使用J2EE应用server的环境里用以提供分布事事务保证

    52910

    Java面试葵花宝典打印版【7】

    90、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别 persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS...当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。...一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。...用try来指定一块预防所有“异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的“异常”的类型。throw语句用来明确地抛出一个“异常”。...throws用来标明一个成员函数可能抛出的各种“异常”。Finally为确保一段代码不管发生什么“异常”都被执行一段代码。

    58940

    基于可靠消息方案的分布式事务(二):Java中的事务

    常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现。...就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚。可以明确的配置在抛出那些异常时回滚事务,包括checked异常。...也可以明确定义那些异常抛出时不回滚事务。还可以通过编程的setRollbackOnly()方法来指示一个事务必须回滚,在调用完setRollbackOnly()后所能执行的唯一操作就是回滚。...Exception类型的异常且需要回滚时,需要捕获异常并通过调用status对象的setRollbackOnly()方法告知事务管理器当前事务需要回滚。...通过本文的介绍,希望读者在接触分布式事务时,首先对Java中的事务能够熟悉。JTA事务时,其实也引出了分布式事务的相关概念,对应2PC和3PC的XA规范。

    1.3K60

    Spring知识点提炼

    容器:Spring包含并管理应用中对象的生命周期和配置 MVC框架: Spring-MVC 事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务JTA 异常处理:Spring...Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。...我们可以通过@Value直接标注某个属性,方法或者方法参数,并传入一个String类型的表达式来装配属性,如: ?...@AfterReturning after-throwing: 在方法抛出异常退出时执行的通知。@AfterThrowing around: 在方法执行之前和之后调用的通知。...回滚规则(rollback-for, no-rollback-for):rollback-for指事务对于那些检查型异常应当回滚而不提交;no-rollback-for指事务对于那些异常应当继续运行而不回滚

    75620

    Spring 知识点提炼

    容器:Spring包含并管理应用中对象的生命周期和配置 MVC框架: Spring-MVC 事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务JTA 异常处理:Spring...Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。...@AfterReturning after-throwing: 在方法抛出异常退出时执行的通知。@AfterThrowing around: 在方法执行之前和之后调用的通知。...JTA事务 如果你的事务需要跨多个事务资源(例如:两个或多个数据库;或者如Sping+ActiveMQ整合需要将ActiveMQ和数据库的事务整合起来),就需要使用JtaTransactionManager...回滚规则(rollback-for, no-rollback-for):rollback-for指事务对于那些检查型异常应当回滚而不提交;no-rollback-for指事务对于那些异常应当继续运行而不回滚

    1K90

    使用Atomikos实现JTA分布式事务

    某种程度上,可以认为JTA规范是XA规范的Java版,其把XA规范中规定的DTP模型交互接口抽象成Java接口中的方法,并规定每个方法要实现什么样的功能。...应用服务器(application server): 顾名思义,是应用程序运行的容器。JTA规范规定,事务管理器的功能应该由application server提供,如上图中的EJB Server。...特别需要注意的是,并不是所有的web容器都实现了JTA规范,如tomcat并没有实现JTA规范,因此并不能提供事务管理器的功能。...可以看到,这里除了红色框中包含的接口定义之外,其他全部是异常(XxxException),这里我们仅讨论JTA规范中定义的接口作用: javax.transaction.Status:事务状态,这个接口主要是定义一些表示事务状态的常量...,当我们需要提交或者回滚一个事务时,不应该再使用Connection接口提供的commit和rollback方法。

    3.6K31

    Spring事务的提交和回滚机制,以及分布式事务的处理解决方案

    Spring事务的提交和回滚机制如下:提交机制:Spring事务的默认提交机制是自动提交。当事务方法顺利执行完成(没有抛出异常)时,Spring会自动将事务提交到数据库中保存。...这意味着对数据库的操作会永久保存。回滚机制:Spring事务的回滚机制可以分为两种情况:未检查异常(unchecked exception):当事务方法抛出未检查异常时,Spring会自动回滚事务。...未检查异常通常是RuntimeException的子类,如NullPointerException、IllegalArgumentException等。...在发生未检查异常时,事务将回滚并数据库中的操作将被撤销。检查异常(checked exception):当事务方法抛出检查异常时,默认情况下Spring不会自动回滚事务。...JTA是Java平台上的标准分布式事务管理API,可以与不同的事务管理器(如JBOSS、WebSphere等)集成。

    1.5K91

    JTA规范

    某种程度上,可以认为JTA规范是XA规范的Java版,其把XA规范中规定的DTP模型交互接口抽象成Java接口中的方法,并规定每个方法要实现什么样的功能。...JTA规范规定,事务管理器的功能应该由application server提供,如上图中的EJB Server。...特别需要注意的是,并不是所有的web容器都实现了JTA规范,如tomcat并没有实现JTA规范,因此并不能提供事务管理器的功能。...可以看到,这里除了红色框中包含的接口定义之外,其他全部是异常(XxxException),这里我们仅讨论JTA规范中定义的接口作用: javax.transaction.Status:事务状态...,在分布式事务中,当我们需要提交或者回滚一个事务时,不应该再使用Connection接口提供的commit和rollback方法。

    1.1K30

    JPA多数据源分布式事务处理-两种事务方案

    的XA数据源包装器,而且在AtomikosJtaConfiguration里已经注册到Spring上下文中,所以我们在自定义数据源时可以直接注入包装器实例,然后,因为是JPA环境,所以在创建EntityManagerFactory...解决问题:默认AtomikosXADataSourceWrapper包装器初始化的数据源连接池最大为1,所以需要添加配置参数如: spring.jta.atomikos.datasource.max-pool-size...sql开始(并不是JTA事务begin阶段),生成xid并XA START事务,然后XA END。...这个方案比较简陋,而且有缺陷,在提交阶段,如果异常不是发生在第一个数据源,那么会存在之前的提交不会回滚,所以在使用ChainedTransactionManager时,尽量把出问题可能性比较大的事务管理器放链的后面...这里只是抛出了一种新的多数据源事务管理的思路,能用XA尽量用XA管理。

    2.4K20
    领券