请问数据库中的双步提交(Two-Phase Commit,2PC)是什么意思?

wingardium 2010-05-21 11:29:06
请举个具体例子说明下,谢谢!
...全文
440 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
problc 2010-05-21
  • 打赏
  • 举报
回复
主要是事务的嵌套会发生2PC
  • 打赏
  • 举报
回复
JTA 在 J2SE 环境中是没办法测试的,必须在 J2EE 应用服务器中。

J2EE 应用服务器为什么说会有好的、差的,免费的和商业的,其中最为重要的一点就是对于事务的处理能力。像开源的 J2EE 应用服务器在这一点上是没办法跟 WebLogic, WebSphere 这些商业 J2EE 应用服务器相比拟的。

在 J2EE 环境中使用 JTA 事务与 Local 事务的代码是一模一样的,对于开发人员来说这绝对是希望听到的。

Local 事务就是通常所称的 Connection 的事务
  • 打赏
  • 举报
回复
2-PC 称为“两阶段提交”,2-PC 是分布式事务协议。

比如说一个事务涉及 Oracle、MySQL 和 MS SQLServer 三个数据库的操作,举个最简单的例子,要在这三个数据库中各插入一条数据,但必须保持在一个事务中,要三个插入全部成功才算成功,如果只成功了一个或者两个,那么所有的操作都进行回滚,而 2-PC 就是用来干这事的。

两阶段提交需要有个中间协调人。在 Java 中只有 JTA 才能支持两阶段提交,而这个中间协调人就是 J2EE 应用服务器。

继续刚才那个事务,两个阶段如下:

一、各数据库在执行完 INSERT 后,J2EE 应用服务器在收到提交指令,这时通知各数据库进行事务提交准备。
数据库在收到响应后,进行准备工作,基本上是一个预提交工作,如果能提交则响应 J2EE 应用服务器是 能成功提交的,如果无法提交则响应 J2EE 应用服务器是无法提交的。

二、J2EE 应用服务器在收集到所有的响应之后进行判断,如果在第一阶段收到的信息都是可提交的,那么就通知所有的数据库进行提交;如果在第一阶段收到的信息有一个是无法提交的,那么就通知所有的数据库进行回滚操作。

通过这些步骤,可以看出分布式事务处理是很耗时的,也是相当麻烦的。因为数据库在第一阶段给事务协调器响应后如果能提交,在第二阶段就必须要保证事务能被提交,这是数据库要做的事情。

这里的 J2EE 应用服务器是 2-PC 的协调者。2-PC 在 JAVA 中不仅可以用于分布式数据库事务,也能应用于 JMS 事务。

要支持分布式事务,那么数据库就必须支持两阶段提交协议,否则是不能支持的。
wingardium 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hardycheng 的回复:]
http://en.wikipedia.org/wiki/Two-phase_commit_protocol

维基百科中的解释
[/Quote]
但是里面没有实际例子。
hardycheng 2010-05-21
  • 打赏
  • 举报
回复
http://en.wikipedia.org/wiki/Two-phase_commit_protocol

维基百科中的解释

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧