📄 chapter51.htm
字号:
.img1 { BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid}.f14 { FONT-SIZE: 14px; LINE-HEIGHT: 26px}.f20 { FONT-WEIGHT: bold; FONT-SIZE: 20px}.top_red { COLOR: #d70709; TEXT-DECORATION: none}.center01 { COLOR: #000000; LINE-HEIGHT: 20px}.center01 TD { COLOR: #000000; LINE-HEIGHT: 20px}.center01 A:link { COLOR: #000000; TEXT-DECORATION: none}.center01 A:visited { COLOR: #000000; TEXT-DECORATION: none}.center01 A:hover { COLOR: #2b7128; TEXT-DECORATION: underline}.center02 { COLOR: #194e00; LINE-HEIGHT: 20px}.center02 TD { COLOR: #194e00; LINE-HEIGHT: 20px}.center02 A:link { COLOR: #194e00; TEXT-DECORATION: none}.center02 A:visited { COLOR: #194e00; TEXT-DECORATION: none}.center02 A:hover { COLOR: #194e00; TEXT-DECORATION: underline}--></style><TABLE width=760 border=0 align=center cellPadding=0 cellSpacing=0 bgcolor="#F3F3F3" valign="top"> <tr class="center01"> <td width="488" style="padding-left:10px;padding-top:10px"> <a href="index.php">连载</a> > <a href="slist.php?class1=6">程序设计</a> > <a href="slist.php?class2=7">Java</a> > <a href="serialize.php?id=387">Java网络编程专辑</a> </td> <td width="280" style="padding-left:10px;padding-top:10px"> <div align="center"> <font color=#0000FF><a href='chapter.php?id=387&volume=4&chapter=2'>上一页</a></font> <font color=#0000FF><a href="serialize.php?id=387">回书目</a></font> <font color=#0000FF><a href='chapter.php?id=387&volume=4&chapter=4'>下一页</a></font> </div> </td> </tr> <tr class="center01"> <td colspan="2" align="center" style="padding-left:10px;padding-top:10px"> </td> </tr> <TBODY> <TR> <TD colspan="2" align=middle> <BR> <div style="FONT-SIZE: 18pt; COLOR: #990000; FONT-FAMILY: 楷体_GB2312" align=center><B>相关API</b></div><br><div style="COLOR: #990000; font-family: ; font-size: 18px;宋体;" align=center>Java Transaction API概述(3)</div> <DIV style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 10.5pt; COLOR: black; LINE-HEIGHT: 180%" align=left> <br> <P> <STRONG>JDBC驱动程序和XAResource</STRONG> <BR><BR> 为了简化XAResource的说明,这些例子说明了一个应用程序在不包含应用程序服务器和事项管理程序的情况下应该如何使用JTA。 基本上,这些例子中的应用程序也担任应用程序服务器和事项管理程序的任务。大部分的企业使用事务管理程序和应用程序服务器,因为它们能够比一个应用程序更能够高效地管理分布式事务。 然而遵循这些例子,一个应用程序开发者可以测试在JDBC驱动程序中的JTA支持的健壮性。而且有一些例子可能不是工作在某个特定的数据库上,这是因为关联在数据库上的一些内在的问题。<BR><BR> 在使用JTA之前,你必须首先实现一个Xid类用来标识事务(在普通情况下这将由事务管理程序来处理)。Xid包含三个元素:formatID、gtrid(全局事务标识符)和bqual(分支修饰词标识符)。 <BR><BR> formatID通常是零,这意味着你将使用OSI CCR(Open Systems Interconnection Commitment, Concurrency和Recovery 标准)来命名。如果你要是用另外一种格式,那么formatID应该大于零。-1值意味着Xid为无效。<BR><BR> gtrid和bqual可以包含64个字节二进制码来分别标识全局事务和分支事务。唯一的要求是gtrid和bqual必须是全局唯一的。此外,这可以通过使用指定在OSI CCR中的命名规则规范来完成。<BR><BR> 下面的例子说明Xid的实现:<BR><BR></P>
<TABLE cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<P>import javax.transaction.xa.*; <BR>public class MyXid implements Xid <BR>{ <BR> protected int formatId; <BR> protected byte gtrid[]; <BR> protected byte bqual[]; <BR> public MyXid() <BR> { <BR> } <BR> public MyXid(int formatId, byte gtrid[], byte bqual[]) <BR> { <BR> this.formatId = formatId; <BR> this.gtrid = gtrid; <BR> this.bqual = bqual; <BR> } <BR><BR> public int getFormatId() <BR> { <BR> return formatId; <BR> } <BR><BR> public byte[] getBranchQualifier() <BR> { <BR> return bqual; <BR> } <BR><BR> public byte[] getGlobalTransactionId() <BR> { <BR> return gtrid; <BR> } <BR><BR>} </P></TD></TR></TBODY></TABLE>
<P><BR><BR> 其次,你需要创建一个你要使用的数据库的数据源:<BR><BR></P>
<TABLE cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<P>public DataSource getDataSource() <BR> throws SQLException <BR> { <BR> SQLServerDataSource xaDS = new <BR> com.merant.datadirect.jdbcx.sqlserver.SQLServerDataSource(); <BR> xaDS.setDataSourceName("SQLServer"); <BR> xaDS.setServerName("server"); <BR> xaDS.setPortNumber(1433); <BR> xaDS.setSelectMethod("cursor"); <BR> return xaDS; <BR>} </P></TD></TR></TBODY></TABLE>
<P><BR> 例1—这个例子是用“两步提交协议”来提交一个事务分支:<BR><BR></P>
<TABLE cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<P>XADataSource xaDS; <BR>XAConnection xaCon; <BR>XAResource xaRes; <BR>Xid xid; <BR>Connection con; <BR>Statement stmt; <BR>int ret; <BR>xaDS = getDataSource(); <BR>xaCon = xaDS.getXAConnection("jdbc_user", "jdbc_password"); <BR>xaRes = xaCon.getXAResource(); <BR>con = xaCon.getConnection(); <BR>stmt = con.createStatement(); <BR>xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02}); <BR>try { <BR> xaRes.start(xid, XAResource.TMNOFLAGS); <BR> stmt.executeUpdate("insert into test_table values (100)"); <BR> xaRes.end(xid, XAResource.TMSUCCESS); <BR> ret = xaRes.prepare(xid); <BR> if (ret == XAResource.XA_OK) { <BR> xaRes.commit(xid, false); <BR> } <BR>} <BR>catch (XAException e) { <BR> e.printStackTrace(); <BR>} <BR>finally { <BR> stmt.close(); <BR> con.close(); <BR> xaCon.close(); <BR>} </P></TD></TR></TBODY></TABLE>
<P><BR> 因为所有这些例子中的初始化代码相同或者非常相似,仅仅是一些重要的地方的代码由不同。<BR><BR> 例2—这个例子,与例1相似,说明了一个返回过程:<BR><BR></P>
<TABLE cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<P>xaRes.start(xid, XAResource.TMNOFLAGS); <BR>stmt.executeUpdate("insert into test_table values (100)"); <BR>xaRes.end(xid, XAResource.TMSUCCESS); <BR>ret = xaRes.prepare(xid); <BR>if (ret == XAResource.XA_OK) { <BR> xaRes.rollback(xid); <BR>} </P></TD></TR></TBODY></TABLE>
<P><BR> 例3—这个例子说明一个分布式事务分支如何中止,让相同的连接做本地事务处理,以及它们稍后该如何继续这个分支。 分布式事务的两步提交作用不影响本地事务。<BR><BR></P>
<TABLE cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<P>xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02}); <BR>xaRes.start(xid, XAResource.TMNOFLAGS); <BR>stmt.executeUpdate("insert into test_table values (100)"); <BR>xaRes.end(xid, XAResource.TMSUSPEND); <BR>∥这个更新在事务范围之外完成,所以它不受XA返回影响。 <BR><BR>stmt.executeUpdate("insert into test_table2 values (111)"); <BR>xaRes.start(xid, XAResource.TMRESUME); <BR>stmt.executeUpdate("insert into test_table values (200)"); <BR>xaRes.end(xid, XAResource.TMSUCCESS); <BR>ret = xaRes.prepare(xid); <BR><BR>if (ret == XAResource.XA_OK) { <BR><BR>xaRes.rollback(xid); <BR><BR>} </P></TD></TR></TBODY></TABLE>
<P><BR> 例4—这个例子说明一个XA资源如何分担不同的事务。 创建了两个事务分支,但是它们不属于相同的分布式事务。 JTA允许XA资源在第一个分支上做一个两步提交,虽然这个资源仍然与第二个分支相关联。<BR><BR></P>
<TABLE cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<P>xid1 = new MyXid(100, new byte[]{0x01}, new byte[]{0x02}); <BR>xid2 = new MyXid(100, new byte[]{0x11}, new byte[]{0x22}); <BR>xaRes.start(xid1, XAResource.TMNOFLAGS); <BR>stmt.executeUpdate("insert into test_table1 values (100)"); <BR>xaRes.end(xid1, XAResource.TMSUCCESS); <BR>xaRes.start(xid2, XAResource.TMNOFLAGS); <BR>ret = xaRes.prepare(xid1); <BR>if (ret == XAResource.XA_OK) { <BR> xaRes.commit(xid2, false); <BR>} <BR>stmt.executeUpdate("insert into test_table2 values (200)"); <BR>xaRes.end(xid2, XAResource.TMSUCCESS); <BR>ret = xaRes.prepare(xid2); <BR>if (ret == XAResource.XA_OK) { <BR> xaRes.rollback(xid2); <BR>} </P></TD></TR></TBODY></TABLE>
<P><BR> 例5—这个例子说明不同的连接上的事务分支如何连接成为一个单独的分支,如果它们连接到相同的资源管理程序。这个特点改善了分布式事务的效率,因为它减少了两步提交处理的数目。两个连接到数据库服务器上的XA将被创建。每个连接创建它自己的XA资源,正规的JDBC连接和语句。在第二个XA资源开始一个事务分支之前,它将察看是否使用和第一个XA资源使用的是同一个资源管理程序。如果这是实例,它将加入在第一个XA连接上创建的第一个分支,而不是创建一个新的分支。 稍后,这个事务分支使用XA资源来准备和提交。<BR><BR></P>
<TABLE cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<P>xaDS = getDataSource(); <BR>xaCon1 = xaDS.getXAConnection("jdbc_user", "jdbc_password"); <BR>xaRes1 = xaCon1.getXAResource(); <BR>con1 = xaCon1.getConnection(); <BR>stmt1 = con1.createStatement(); <BR><BR>xid1 = new MyXid(100, new byte[]{0x01}, new byte[]{0x02}); <BR>xaRes1.start(xid1, XAResource.TMNOFLAGS); <BR>stmt1.executeUpdate("insert into test_table1 values (100)"); <BR>xaRes1.end(xid, XAResource.TMSUCCESS); <BR>xaCon2 = xaDS.getXAConnection("jdbc_user", "jdbc_password"); <BR>xaRes2 = xaCon1.getXAResource(); <BR>con2 = xaCon1.getConnection(); <BR>stmt2 = con1.createStatement(); <BR><BR>if (xaRes2.isSameRM(xaRes1)) { <BR> xaRes2.start(xid1, XAResource.TMJOIN); <BR> stmt2.executeUpdate("insert into test_table2 values (100)"); <BR> xaRes2.end(xid1, XAResource.TMSUCCESS); <BR>} <BR>else { <BR> xid2 = new MyXid(100, new byte[]{0x01}, new byte[]{0x03}); <BR> xaRes2.start(xid2, XAResource.TMNOFLAGS); <BR> stmt2.executeUpdate("insert into test_table2 values (100)"); <BR> xaRes2.end(xid2, XAResource.TMSUCCESS); <BR> ret = xaRes2.prepare(xid2); <BR> if (ret == XAResource.XA_OK) { <BR> xaRes2.commit(xid2, false); <BR> } <BR>} <BR>ret = xaRes1.prepare(xid1); <BR>if (ret == XAResource.XA_OK) { <BR> xaRes1.commit(xid1, false); <BR>} <BR></P></TD></TR></TBODY></TABLE>
<P><BR> 例6—这个例子说明在错误恢复的阶段,如何恢复准备好的或者快要完成的事务分支。 它首先试图返回每个分支;如果它失败了,它尝试着让资源管理程序丢掉关于事务的消息。<BR><BR></P>
<TABLE cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<P>MyXid[] xids; <BR>xids = xaRes.recover(XAResource.TMSTARTRSCAN | XAResource.TMENDRSCAN); <BR>for (int i=0; xids!=null && i<XIDS.LENGTH; <br { i++)> try { <BR> xaRes.rollback(xids[i]); <BR> } <BR> catch (XAException ex) { <BR> try { <BR> xaRes.forget(xids[i]); <BR> } <BR> catch (XAException ex1) { <BR> System.out.println("rollback/forget failed: " + ex1.errorCode); <BR> } <BR>} <BR><BR>} <BR></P></TD></TR></TBODY></TABLE><br><br> </DIV> </TD> </TR> <TR> <TD class=center01> <div align="center">来源:天极网 作者:<div> </TD> <TD width="280" class=center01> <div align="center"> <font color=#0000FF><a href='chapter.php?id=387&volume=4&chapter=2'>上一页</a></font> <font color=#0000FF><a href="serialize.php?id=387">回书目</a></font> <font color=#0000FF><a href='chapter.php?id=387&volume=4&chapter=4'>下一页</a></font> </div> </TD> </TR> </TBODY></TABLE><table><tr><td width="760"> <table width="760" height="10" border="0" cellpadding="0" cellspacing="0"> <tr> <td></td> </tr> </table> <!------------ 评论 ----------------> <table width="760" border="0" cellpadding="0" cellspacing="0"> <tr> <td><iframe width="100%" id=vs frameborder=0 scrolling=no src="comment_list1.php?id=387"></iframe> </td> </tr> </table><br><script language=javascript>function CheckNetwordForm(theForm){ if("" == theForm.content.value) { alert("写两句吧~~"); theForm.content.focus(); return false; } var index; for(index=0;index<theForm.content.value.length;index++) { if(" " != theForm.content.value.charAt(index)) break; } if(index == theForm.content.value.length) { alert("写两句吧~~"); theForm.content.focus(); return false; } if (theForm.content.value.length>100){ alert("评论字数不能超过100哦"); theForm.content.focus(); return false; } return true;}</script> <!------------------ 评论 ---------------> <form name=netword method=post action="insertnetword.php" onsubmit="javascript: return CheckNetwordForm(this);"> <table width="760" border="0" cellpadding="0" cellspacing="0"> <tr> <td height="25" class="text6"> 给此书打分:<a name="1"></a> <select name="score"> <option value=5 selected>非常好</option> <option value=4>还凑合</option> <option value=3>一般吧</option> <option value=2>不太行</option> <option value=1>太差了</option> </select> 用户名: <input name="id" value=387 type="hidden" id="id"> <input name="backurl" value=/book/chapter.php?id=387&volume=4&chapter=3 type="hidden"> <input name="username" type="text" id="username" size="20" maxlength="20"> <font color="#666666">*评论字数请控制在一百字以内</font> </td> </tr> </table> <br> <textarea name="content" cols="80" rows="4" wrap="OFF" id="description"></textarea> <input type="submit" name="Submit" value="提交"> </form> </td> </tr></table></td></tr></table> <TABLE cellSpacing=0 cellPadding=0 width=760 border=0> <TBODY> <TR> <TD width="1003" height=9 background=images/t_bj01.gif><IMG height=1 src="images/ccc.gif" width=1></TD> </TR> </TBODY></TABLE><TABLE cellSpacing=0 cellPadding=0 width=760 bgColor=#ffffff border=0> <TBODY> <TR> <TD><HR width=760 noShade SIZE=1> </TD> </TR> <TR> <TD align=middle><A class=black href="http://www.chinaren.com/" target=_blank>ChinaRen</A> - <A class=black href="http://big5.www.sohu.com/" target=_blank>繁体版</A> - <A class=black href="http://hr.sohu.com/hrm.html" target=_blank>搜狐招聘</A> - <A class=black href="http://add.sohu.com/" target=_blank>网站登录</A> - <A class=black href="http://help.sohu.com/" target=_blank>帮助中心</A> - <A class=black href="http://book.news.sohu.com/onClick=this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.sohu.com');return" target=_blank false;>设置首页</A> - <A class=black href="http://adinfo.sohu.com/" target=_blank>广告服务</A> - <A class=black href="http://www.sohu.com/about/lianxi.htm" target=_blank>联系方式</A> - <A class=black href="http://www.sohu.com/about/privacy.html" target=_blank>保护隐私权</A> - <A class=black href="http://www.sohu.com/about/" target=_blank>About SOHU</A> - <A class=black href="http://www.sohu.com/about/" target=_blank>公司介绍</A><BR> <SPAN class=eng>Copyright © 2004 Sohu.com Inc. All rights reserved. 搜狐公司 版权所有</SPAN> </TD> </TR> </TBODY></TABLE></center></body></html><script language="JavaScript" src="http://nielsen.js.sohu.com/nnselect.js"></script><noscript><img src='http://ping.nnselect.com/ping.gif?c=119' height='1' width='1'></noscript>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -