[java][db]JAVA分布式事务原理及应用

spring 事务传播机制总结 spring事务的传播机制定义在 TransactionDefinition 接口中,定义了如下传播类型 PROPAGATION_REQUIRED 支持当前事务,如果没有当前事务就创建一个新的事务,是默认的传播行为。 外围方法未开启事务 内部会创建新事务,若新事务回滚,不影响外围方法。 外围方法开启事务 内部方法会加入到外围方法的事务中,使用同一个事务,不管内外谁发生异常,整个事务都将回滚。 /** * Support a current transaction; create a 阅读详情
JTA(Java Transaction API)允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序的JTA支持极大地增强了数据访问能力。 

  本文的目的是要提供一个关于的Java事务处理API(JTA)的高级的概述,以及与分布式事务相关的内容。一个事务处理定义了一个工作逻辑单元,要么彻底成功要么不产生任何结果。 一个分布式事务处理只是一个在两个或更多网络资源上访问和更新数据的事务处理,因此它在那些资源之间必然是等价的。在本文中,我们主要关心的是如何处理关系数据库系统。 

  我们要讨论的分布式事务处理(DTP)模型中包含的组件是: 

    应用程序 

    应用程序服务器 

    事务管理程序 

    资源适配器 

    资源管理程序 

  在以后的内容中,我们将描述这些组件以及它们与JTA和数据库访问的关系。 

  访问数据库 

  最好把分布式事务处理中包含的组件看作是独立的过程,而不是考虑它们在一个特定的电脑中的位置。这些组件中的一些可以保存在单机中,或者也可在好几台机器之间分布。 下面例子中的图表可以显示在一台特定的电脑上的组件,但是这些操作之间的关系是必须首要考虑的。 

  最简单的例子:用于本地数据库事务处理的应用程序 

  关系数据库访问的最简单的形式仅仅包括应用程序、资源管理程序和资源适配器。应用程序只不过是发送请求到数据库并且从数据库中获取数据的最终用户访问点 

  我们讨论的资源管理程序是一个关系数据库管理系统(RDBMS),比如Oracle或者SQL Server。所有的实际数据库管理都是由这个组件处理的。 

  资源适配器是外部空间之间的通信管道组件,或者是请求翻译器,在本例中,是应用程序和资源管理程序。在我们的讨论中,这是一个JDBC驱动程序。 

  下面的描述是资源管理程序本地事务处理的一个描述,也就是说,一个事务处理被被限制在一个特定的企业数据库。 

  应用程序发送一个用于JDBC驱动程序数据的请求,然后翻译这个请求并把它通过网络发送到数据库中。 数据库把数据发送回驱动程序,然后把翻译的结果发送回应用程序,如下图所示:

  


这个例子说明了在一个简化的系统中的基本的信息流;然而,今天的企业使用的应用程序服务器都添加了其他的组件到这个过程处理中。 



  应用程序服务器 

  应用程序服务器是事务处理操作的另一个组件。应用程序服务器处理大部分的应用程序操作并且获得最终用户应用程序的一些负载。基于前面的例子,我们可以看出应用程序服务器在事务处理上添加了另一个操作层: 


   

到目前为止,我们的例子说明了单个的本地事务处理,并且描述了分布式事务处理模型的五个组件中的四个。第五个组件,事务管理程序只有当事务将要被分配的时候才会开始被考虑。 

  分布式事务处理和事务管理程序 

  像我们前面所提到的,一个分布式事务处理是一个在两个或更多网络资源上访问和更新数据的事务处理。 

  这些资源可以由好几个位于一个单独服务器上的不同的关系型数据库管理系统组成,比如说Oracle、SQL Server和Sybase;它们也可以包含存在于若干不同的服务器上的同一种数据库的若干个实例。在任何情况下,一个分布式事务处理包括各种的资源管理程序之间的协同作用。这个协同作用是事务管理函数。 

  事务管理程序负责作出要么提交(commit)要么退回(rollback)任何分布式事务处理的决定。一个提交决定应该导致一个成功的事务处理;而退回操作则是保持数据库中的数据不变。 JTA指定一个分布式事务处理中的事务管理程序和另一个组件之间的标准Java接口:应用程序,应用程序服务器和资源管理程序。 这个关系被显示在下面的图表中: 



  在事务管理程序周围的数字框框相应于JTA的三个接口部分: 

  1—UserTransaction—javax.transaction.UserTransaction接口提供能够编程地控制事务处理范围的应用程序。 javax.transaction.UserTransaction方法开启一个全局事务并且使用调用线程与事务处理关联。 

  2—Transaction Manager—javax.transaction.TransactionManager接口允许应用程序服务器来控制代表正在管理的应用程序的事务范围。 

  3—XAResource—javax.transaction.xa.XAResource接口是一个基于X/Open CAE Specification的行业标准XA接口的Java映射。 

  注意,一个限制性环节是通过JDBC驱动程序的XAResource接口的支持。JDBC驱动程序必须支持两个正常的JDBC交互作用:应用程序和/或应用程序服务器,而且以及JTA的XAResource部分。 

  编写应用程序水平代码的开发者不会关心分布式事务处理管理的细节。 这是分布式事务处理基本结构的工作—应用程序服务器、事务管理程序和JDBC驱动程序。应用程序代码中唯一的需要注意的就是当连接处于一个分布式事务范围内的时候,不应该调用一个会影响事务边界的方法。特别的是,一个应用程序不应该调用Connection方法commit、rollback和setAutoCommit(true),因为它们将破坏分布式事务的基本结构管理。 

  分布式事务处理 

  事务管理程序是分布式事务基本结构的基本组件;然而JDBC驱动程序和应用程序服务器组件应该具备下面的特征: 

  驱动程序应该实现JDBC 2.0应用程序接口,包括Optional Package接口XADataSource和XAConnection以及JTA接口XAResource。 

  应用程序服务器应该提供一个DataSource类,用来实现与分布式事务基本结的交互以及一个连接池模块(用于改善性能)。 

  分布式事务处理的第一步就是应用程序要发送一个事务请求到事务管理程序。虽然最后的commit/rollback决定把事务作为一个简单的逻辑单元来对待,但是仍然可能会包括许多事务分支。一个事务分支与一个到包含在分布式事务中的每个资源管理程序相关联。因此,到三个不同的关系数据库管理的请求需要三个事务分支。每个事务分支必须由本地资源管理程序提交或者返回。事务管理程序控制事务的边界,并且负责最后决定应该提交或者返回的全部事务。 这个决定由两个步骤组成,称为Two - Phase Commit Protocol。 

  在第一步骤中,事务管理程序轮询所有包含在分布式事务中的资源管理程序(关系数据库管理)来看看哪个可以准备提交。如果一个资源管理程序不能提交,它将不响应,并且把事务的特定部分返回,以便数据不被修改。 

  在第二步骤中,事务管理程序判断否定响应的资源管理程序中是否有能够返回整个事务的。如果没有否定响应的话,翻译管理程序提交整个事务并且返回结果到应用程序中。 

  开发事项管理程序代码的开发者必须与所有三个JTA接口有关:UserTransaction、TransactionManager和XAResource,这三个接口都被描述在 

  Sun JTA specification中。JDBC驱动程序开发者只需要关心XAResource接口。这个接口是允许一个资源管理程序参与事务的行业标准X/Open XA协议的Java映射。连接XAResource接口的驱动程序组件负责在事务管理程序和资源管理程序之间担任"翻译"的任务。下面的章节提供了XAResource调用的例子。 

  JDBC驱动程序和XAResource 

  为了简化XAResource的说明,这些例子说明了一个应用程序在不包含应用程序服务器和事项管理程序的情况下应该如何使用JTA。 基本上,这些例子中的应用程序也担任应用程序服务器和事项管理程序的任务。大部分的企业使用事务管理程序和应用程序服务器,因为它们能够比一个应用程序更能够高效地管理分布式事务。 然而遵循这些例子,一个应用程序开发者可以测试在JDBC驱动程序中的JTA支持的健壮性。而且有一些例子可能不是工作在某个特定的数据库上,这是因为关联在数据库上的一些内在的问题。 

  在使用JTA之前,你必须首先实现一个Xid类用来标识事务(在普通情况下这将由事务管理程序来处理)。Xid包含三个元素:formatID、gtrid(全局事务标识符)和bqual(分支修饰词标识符)。 

  formatID通常是零,这意味着你将使用OSI CCR(Open Systems Interconnection Commitment, Concurrency和Recovery 标准)来命名。如果你要是用另外一种格式,那么formatID应该大于零。-1值意味着Xid为无效。 

  gtrid和bqual可以包含64个字节二进制码来分别标识全局事务和分支事务。唯一的要求是gtrid和bqual必须是全局唯一的。此外,这可以通过使用指定在OSI CCR中的命名规则规范来完成。 

  下面的例子说明Xid的实现: 


import javax.transaction.xa.*; 
public class MyXid implements Xid 
{ 
 protected int formatId; 
 protected byte gtrid[]; 
 protected byte bqual[]; 
 public MyXid() 
 { 
 } 
 public MyXid(int formatId, byte gtrid[], byte bqual[]) 
 { 
  this.formatId = formatId; 
  this.gtrid = gtrid; 
  this.bqual = bqual; 
 } 

 public int getFormatId() 
 { 
  return formatId; 
 } 

 public byte[] getBranchQualifier() 
 { 
  return bqual; 
 } 

 public byte[] getGlobalTransactionId() 
 { 
  return gtrid; 
 } 

} 




  其次,你需要创建一个你要使用的数据库的数据源: 


public DataSource getDataSource() 
 throws SQLException 
 { 
  SQLServerDataSource xaDS = new 
  com.merant.datadirect.jdbcx.sqlserver.SQLServerDataSource(); 
  xaDS.setDataSourceName("SQLServer"); 
  xaDS.setServerName("server"); 
  xaDS.setPortNumber(1433); 
  xaDS.setSelectMethod("cursor"); 
  return xaDS; 
} 



  例1—这个例子是用“两步提交协议”来提交一个事务分支: 


XADataSource xaDS; 
XAConnection xaCon; 
XAResource xaRes; 
Xid xid; 
Connection con; 
Statement stmt; 
int ret; 
xaDS = getDataSource(); 
xaCon = xaDS.getXAConnection("jdbc_user", "jdbc_password"); 
xaRes = xaCon.getXAResource(); 
con = xaCon.getConnection(); 
stmt = con.createStatement(); 
xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02}); 
try { 
  xaRes.start(xid, XAResource.TMNOFLAGS); 
  stmt.executeUpdate("insert into test_table values (100)"); 
  xaRes.end(xid, XAResource.TMSUCCESS); 
  ret = xaRes.prepare(xid); 
  if (ret == XAResource.XA_OK) { 
    xaRes.commit(xid, false); 
   } 
} 
catch (XAException e) { 
 e.printStackTrace(); 
} 
finally { 
 stmt.close(); 
 con.close(); 
 xaCon.close(); 
} 



  因为所有这些例子中的初始化代码相同或者非常相似,仅仅是一些重要的地方的代码由不同。 

  例2—这个例子,与例1相似,说明了一个返回过程: 


xaRes.start(xid, XAResource.TMNOFLAGS); 
stmt.executeUpdate("insert into test_table values (100)"); 
xaRes.end(xid, XAResource.TMSUCCESS); 
ret = xaRes.prepare(xid); 
if (ret == XAResource.XA_OK) { 
 xaRes.rollback(xid); 
} 



  例3—这个例子说明一个分布式事务分支如何中止,让相同的连接做本地事务处理,以及它们稍后该如何继续这个分支。 分布式事务的两步提交作用不影响本地事务。 


xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02}); 
xaRes.start(xid, XAResource.TMNOFLAGS); 
stmt.executeUpdate("insert into test_table values (100)"); 
xaRes.end(xid, XAResource.TMSUSPEND); 
∥这个更新在事务范围之外完成,所以它不受XA返回影响。 

stmt.executeUpdate("insert into test_table2 values (111)"); 
xaRes.start(xid, XAResource.TMRESUME); 
stmt.executeUpdate("insert into test_table values (200)"); 
xaRes.end(xid, XAResource.TMSUCCESS); 
ret = xaRes.prepare(xid); 

if (ret == XAResource.XA_OK) { 

xaRes.rollback(xid); 

} 



  例4—这个例子说明一个XA资源如何分担不同的事务。 创建了两个事务分支,但是它们不属于相同的分布式事务。 JTA允许XA资源在第一个分支上做一个两步提交,虽然这个资源仍然与第二个分支相关联。 


xid1 = new MyXid(100, new byte[]{0x01}, new byte[]{0x02}); 
xid2 = new MyXid(100, new byte[]{0x11}, new byte[]{0x22}); 
xaRes.start(xid1, XAResource.TMNOFLAGS); 
stmt.executeUpdate("insert into test_table1 values (100)"); 
xaRes.end(xid1, XAResource.TMSUCCESS); 
xaRes.start(xid2, XAResource.TMNOFLAGS); 
ret = xaRes.prepare(xid1); 
if (ret == XAResource.XA_OK) { 
 xaRes.commit(xid2, false); 
} 
stmt.executeUpdate("insert into test_table2 values (200)"); 
xaRes.end(xid2, XAResource.TMSUCCESS); 
ret = xaRes.prepare(xid2); 
if (ret == XAResource.XA_OK) { 
 xaRes.rollback(xid2); 
} 



  例5—这个例子说明不同的连接上的事务分支如何连接成为一个单独的分支,如果它们连接到相同的资源管理程序。这个特点改善了分布式事务的效率,因为它减少了两步提交处理的数目。两个连接到数据库服务器上的XA将被创建。每个连接创建它自己的XA资源,正规的JDBC连接和语句。在第二个XA资源开始一个事务分支之前,它将察看是否使用和第一个XA资源使用的是同一个资源管理程序。如果这是实例,它将加入在第一个XA连接上创建的第一个分支,而不是创建一个新的分支。 稍后,这个事务分支使用XA资源来准备和提交。 


xaDS = getDataSource(); 
xaCon1 = xaDS.getXAConnection("jdbc_user", "jdbc_password"); 
xaRes1 = xaCon1.getXAResource(); 
con1 = xaCon1.getConnection(); 
stmt1 = con1.createStatement(); 

xid1 = new MyXid(100, new byte[]{0x01}, new byte[]{0x02}); 
xaRes1.start(xid1, XAResource.TMNOFLAGS); 
stmt1.executeUpdate("insert into test_table1 values (100)"); 
xaRes1.end(xid, XAResource.TMSUCCESS); 
xaCon2 = xaDS.getXAConnection("jdbc_user", "jdbc_password"); 
xaRes2 = xaCon1.getXAResource(); 
con2 = xaCon1.getConnection(); 
stmt2 = con1.createStatement(); 

if (xaRes2.isSameRM(xaRes1)) { 
 xaRes2.start(xid1, XAResource.TMJOIN); 
 stmt2.executeUpdate("insert into test_table2 values (100)"); 
 xaRes2.end(xid1, XAResource.TMSUCCESS); 
} 
else { 
 xid2 = new MyXid(100, new byte[]{0x01}, new byte[]{0x03}); 
 xaRes2.start(xid2, XAResource.TMNOFLAGS); 
 stmt2.executeUpdate("insert into test_table2 values (100)"); 
 xaRes2.end(xid2, XAResource.TMSUCCESS); 
 ret = xaRes2.prepare(xid2); 
 if (ret == XAResource.XA_OK) { 
  xaRes2.commit(xid2, false); 
 } 
} 
ret = xaRes1.prepare(xid1); 
if (ret == XAResource.XA_OK) { 
 xaRes1.commit(xid1, false); 
} 



  例6—这个例子说明在错误恢复的阶段,如何恢复准备好的或者快要完成的事务分支。 它首先试图返回每个分支;如果它失败了,它尝试着让资源管理程序丢掉关于事务的消息。 


MyXid[] xids; 
xids = xaRes.recover(XAResource.TMSTARTRSCAN | XAResource.TMENDRSCAN); 
for (int i=0; xids!=null && i 
 try { 
  xaRes.rollback(xids[i]); 
 } 
 catch (XAException ex) { 
  try { 
   xaRes.forget(xids[i]); 
  } 
 catch (XAException ex1) { 
  System.out.println("rollback/forget failed: " + ex1.errorCode); 
 } 
} 

} 
掌握 Java 里 Zookeeper 的分布式事务处理 在当今的互联网世界里,很多大型的系统都是分布式的,就像一个大的团队由很多小团队一起合作完成任务。分布式事务处理就是要保证在这样的分布式系统中,各个部分的操作要么都成功,要么都失败,就像团队的任务要么一起完成,要么都不做。我们的目的就是学习如何在 Java 语言里,使用 Zookeeper 这个工具来实现分布式事务处理。本文的范围会涵盖从基本概念的解释到实际代码的实现,以及相关的应用场景和未来发展。我们会先介绍一些核心概念,就像盖房子要先打好地基一样。 阅读详情

相关推荐

Java 领域 MyBatis 处理数据库事务回滚的方案

本文旨在全面介绍 MyBatis 框架中处理数据库事务回滚的各种技术方案,涵盖从基础概念到高级应用的完整知识体系。重点分析 MyBatis 原生事务管理机制以及与 Spring 框架集成的事务处理方式。文章将从基础概念开始,逐步深入到 MyBatis 事务实现原理,然后通过实际代码示例展示各种事务回滚方案,最后讨论高级应用场景和未来发展趋势。事务(Transaction): 数据库操作的逻辑单元,具有ACID特性回滚(Rollback): 撤销事务中已执行的操作,使数据库恢复到事务开始前的状态。

AI开发架构师 1045

Java Transaction API概述

引言   JTA(Java Transaction API)允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序的JTA支持极大地增强了数据访问能力。   本文的目的是要提供一个关于的Java事务处理API(JTA)的高级的概述,以及与分布式事务相关的内容。一个事务处理定义了一个工作逻辑单元,要么彻底成功要么不产生任何结果。 一个分布式事务处...

小头猪 485

学术版GPT安装教程——保姆版(附带原生GPT注册教程)

学术版GPT图文安装教程

DBenD的博客 2万+

Jakarta项目介绍

升级到Spring 6或Spring Boot 3遇到的问题;IDEA强大功能;;升级javax到jakarta,及两者区别;Jakarta EE;jakarta依赖;jakarta项目;单独项目;

lonelymanontheway的博客 4946

FileZilla Server 1.2.0 TLS证书过期问题

FileZilla Server TLS证书过期后重新生成

Wigle的备忘录 7527

【ESP32设备通信】-两个ESP32间UART通信

在本文中,我们将使用 Arduino IDE 的 UART 硬件库在两个 ESP32 板之间执行 UART 或串行通信。 要使用 USB 端口调试和编程 ESP32,需要使用称为通用异步接收器/发送器 (UART) 通信的串行端口。 对于大多数传感器和系统,主要的通信方法被认为是 UART。 为了共享工作负载、信息和执行不同的任务,有时需要在两个 ESP32 开发板之间进行通信。

视觉与物联智能 2995

Java 分布式事务之JTA事务从入门到精通

最近回顾 事务相关的设计与实现,发现 Spring 事务设计的最初目的是为了统一 Java 中 JDBC、JTA 与 JPA 事务的使用方式,并且其实现参考了 JTA 规范。大多数人对 JDBC 都比较熟悉,而 JTA 和 JPA 由于使用较少,很多人对其比较陌生,尤其是 JTA。接下来会跟大家说明其他事务 像JDBC 事务 Hibernate 事务EJB 事务都会和大家一一介绍。

林在闪闪发光的博客 2252

嵌入式工程师成长之路(1)——元件基础(完整版)

为什么你的电路总是“玄学”故障?答案藏在这些元件里! 0欧电阻竟能引发信号反射?5V转3.3V电平匹配失败导致MCU烧毁?电容降压设计让电源“滋滋”响?——这些坑,本文全填平! 优快云硬件领域头部博主十年踩坑经验汇总,覆盖电阻、电容、电感核心难点+高频实战问题,让你从“调试地狱”直通“一次成功”!

云轩阁 2万+

深入理解与实践Java事务管理技术

Java事务是Java应用程序在处理数据库操作时保证数据一致性和完整性的关键机制。在Java中,事务通常通过JDBC或更高级的框架如Spring等来实现管理。ACID(Atomicity, Consistency, Isolation, Durability)原则是事务的核心属性,确保了事务执行过程中的原子性、一致性、隔离性和持久性。

聚焦于深度解析最新的编程语言特性、框架升级、架构设计、开发工具和最佳实践,涵盖Web前端(如Vue3, React, Angular等)、后端开发(如Node.js, Java, Python等)、移动端开发(iOS, Android原生及跨平台开发) 3万+

嵌入式工程师成长之路(7)——算法学习

算法大全1、风仲达——算法笔记2、坐在马桶上学算法3、啊哈算法4、深度强化学习实验室。

云轩阁 4万+

适航规章、标准,书籍资料下载汇总(增加DO-297 IMA)

从事IMA平台适航工作的朋友看过来,DO-297英文版PDF可以下载了!更新日志:2024-9-28:初版。2024-10-21:增加DO-330英文版PDF下载,后台回复关键词”330“获取下载链接。2024-10-30:增加DO-160G中文版(非机翻)和英文版PDF下载,后台回复关键词”160“获取下载链接。2024-11-10:增加DO-297英文版PDF下载,后台回复关键词”297“获取下载链接。以下是一些收集到的适航相关的资料,分享给大家。

qq_41854911的博客 1578

java分布式事务原理_[java][db]JAVA分布式事务原理及应用

2—Transaction Manager—javax.transaction.TransactionManager接口同意应用程序server来控制代表正在管理的应用程序的事务范围。3—XAResource—javax.transaction.xa.XAResource接口是一个基于X/Open CAE Specification的行业标准XA接口的Java映射。注意,一个限制性环节是通过JDB...

weixin_34791683的博客 140

EMC原理-传导(共模、差模)与辐射(近场、远场)详解

本文深入介绍了电磁兼容(EMC)的基本概念,包括EMI和EMS,以及如何处理传导干扰(共模、差模)和辐射干扰(近场、远场)。详细讨论了近场感应、远场辐射的原理,滤波器和屏蔽技术在抑制噪声信号中的作用。此外,探讨了差模和共模干扰的来源、影响及滤除方法,如使用差模电感、电容和共模线圈。最后,提到了穿心电容在滤除高频噪声中的应用。

让你爱上电路设计 3551

学Java不能不知道的分布式事务(基础篇)

前言 最近看了几篇有关于分布式事务的博文,做一下笔记。哈哈~ 开始之前,记得点赞收藏加关注哦 ,需要下载PDF版本和更多知识点、面试题的朋友可以点一点下方链接免费领取 链接:点这里!!! 799215493 暗号:优快云 数据库事务 数据库事务(简称:事务),是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。 数据库事务的几个典型特性:原子性(Atomicity )、一致性( Consistency )、

XingXing_Java的博客 496

【HALCON工业视觉应用探索】08. C#+Halcon视觉引导机器人抓取:从入门到工业级实战(附完整代码+部署指南)

摘要:本文聚焦C#+Halcon在视觉引导机器人抓取领域的落地应用,从新手友好的“二十分钟基础引导系统”切入,逐步深入工业级场景(汽车变速箱壳体抓取)。内容涵盖核心概念(手眼标定原理、坐标转换、机器人通信协议)、完整技术流程(图像采集→目标定位→标定转换→机器人执行→结果反馈)、工业级代码实现(多目标识别、智能抓取策略、实时状态监控),以及现场部署关键技巧(硬件选型、通信配置、精度优化)。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1265

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SpringCloudAlibaba之Seata分布式事务

Seata 是什么? Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 AT 模式 前提 基于支持本地 ACID 事务的关系型数据库。 Java 应用,通过 JDBC 访问数据库。 整体机制 两阶段提交协议的演变: 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。 二阶段: 提交异步化,非常快速地完成。 回滚通过一阶段的回滚日志

一半的博客 510

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JAVA分布式事务小结

分布式事务处理(  Distributed Transaction Processing  ,  DTP  )涉及多个分布在不同地方的数据库,但对数据库的操作必须全部被提交或者回滚。只要任一数据库操作时失败,所有参与事务的数据库都需要回滚。   举个例子,A服务部署在tomcat上,执行insert a并调用B和C接口,   B服务部署在weblogic上,执行insert b, C服务部署

xt4717的专栏 282

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

java 事务原理_深入理解Java事务的原理与应用

一、什么是JAVA事务通常的观念认为,事务仅与数据库相关。事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示 当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状...

weixin_31748605的博客 627

使用 JTA 处理 DB2 UDB 和 Informix Dynamic Server 中的分布式事务

<br />级别: 初级<br />Uwe Weber (uwe.weber@de.ibm.com ), Informix 和 DB2 UDB 的 IT 专家, IBM Germany<br />2005 年 5 月 26 日<br /> 更 新 2005 年 5 月 23 日 如果您正在使用 Java™ 开发数据库应用程序,并在寻找用于实现跨数据库的分布式事务解决方案,那么您应该评估一下 Java Transaction API(JTA)。本文将向您介绍分布式事务,以及

Edwin’s Blog 1285

2025最新Java面试八股文(分类归纳+原理详解+避坑指南)程序员跳槽必备

最后,我想说的是,学习并非难事,而贵在坚持,尤其是在我们参与工作之后,要继续坚持学习就更不容易了。但对于程序员来说,学习是立业之根本,如若放弃学习,被市场淘汰是迟早的事情。所以,学习更多新的知识对于自己来说才是一种更大的投资。以上,到此结束。

m0_69632475的博客 2417

2021最新Java面试题,进来看,20K以上待遇

Java基础 什么是 Java 程序的主类?应用程序和小程序的主类有何不同? 构造器 Constructor 是否可被 override? String StringBuffer 和 StringBuilder 的区别是什么?String 为什么是不可变的? 对象的相等与指向他们的引用相等,两者有什么不同? 重载和重写的区别? 在一个静态方法内调用一个非静态成员为什么是非法的? 简述线程,程序、进程的基本概念。以及他们之间关系是什么 什么是方法的返回值?返回值在类的方法里的作用是什么? 一

qq_41879287的博客 247

MySQL事务学习 --> 分布式事务

7 分布式事务 Innodb存储引擎支持XA事务,通过XA事务可以支持分布式事务的实现。分布式事务指的是允许多个独立的事务资源(transac tional resources)参与一个全局的事务中。事务资源通常是关系型数据库系统,也可以是其它类型的资源。 全局事务要求在其中所有参与的事务要么全部提交,要么全部回滚,这对于事务原有的ACID要求又有了提高。另外,在使用分布式事务时候,I...

系统 运维 121

循序渐进!java静态函数调用

前言 分布式事务主要解决分布式一致性的问题。说到底就是数据的分布式操作导致仅依靠本地事务无法保证原子性。与单机版的事务不同的是,单机是把多个命令打包成一个统一处理,分布式事务是将多个机器上执行的命令打包成一个命令统一处理。 MySQL 提供了redo log,undo log, Read View,两阶段提交,MVCC 机制等等来保障事务的安全。分布式事务是不是更难呢?拭目以待。 腾讯 一面(支付) 1.jqc的介绍 2.如何确保多台机器不会重复消费 3.如何确保消费了反馈失效问题(用事务管理,先储存再消费

m0_57624876的博客 128

Java程序员的分布式数据库实战指南

分布式数据库,简单来说,就是将数据分散存储在多个物理节点上的数据库系统。这些节点通过网络连接,协同工作,对外呈现出一个统一的数据库视图 ,就像一个大型的图书馆,里面有多个书架(节点),每个书架上存放着不同类别的书籍(数据)。当你想要查找一本书时,不需要知道它具体在哪个书架上,图书馆的检索系统(分布式数据库管理系统)会帮你快速找到。分布式数据库具有诸多显著特点。高可用性是其关键特性之一,通过数据冗余备份机制,即使某些节点出现故障,整个系统仍能正常运行。

m0_73978383的博客 1119
上一篇: [Java][activiti]Activiti的流程委托功能[getAssignee()与getOwner()的区别]
下一篇: [DB][mybatis]MyBatis mapper文件中的变量引用方式#{}与${}的差别
逐浪_一生悬命
博客等级 码龄24年 468粉丝 200原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值