快速业务通道

用JOTM向Servlet中添加事务 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
访问资源和执行操作:

foo.BankAccount 代表给定客户的银行帐号 account,并能通过 JDBC在 account 执行数据库操作。

bar.ATM 代表 ATM,并在 atm 表上执行 JDBC 操作。

bar.CashDelivery 使用前面两个类来执行一个客户操作。

所有逻辑在 CashDelivery.java 的 deliverCash 方法中实现。

javax.transaction.UserTransaction 接口用于划分事务所有 utx.begin() 和 utx.commit() (或 utx.rollback())之间的操作在同一事务内执行。这确保了 应用程序不会受到如前述的遭遇。

事务使得应用程序更为简单,由以下简单的步骤组成:

1. 开始事务。

2. 联系客户的银行帐户并从帐户上提款。

3. 告诉 ATM 传送钱。

4. 完成事务:如果所有事件完成,提交事务。否则,回滚事务。

5. 报告客户事务结果。如果事务成功,现金将被提出,钱数也将从帐户上提 出。否则,一切都不会改变。

例1. CashDelivery.java

public boolean deliver(String client, int value) { InitialContext ctx     = new InitialContext(); UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/UserTransaction");    ... boolean success = false; try { // 开始事务 utx.begin(); //联系客户银行帐户... BankAccount account = new BankAccount(client); // ... 从帐户上提款 account.withdraw(value); //联系 ATM... ATM atm = new ATM(); // ... 传送现金给客户 atm.deliverCash(value); //一切正常 success = true; } catch (Exception e) { // 出现故障,不得不 // 报告给客户 explanation += e.getMessage(); } finally { try { if (success) { /*一切正常提交事务 直到现在,钱才真正的从帐户上提出,并且将现金传送给客户。          */ utx.commit(); } else { /* 出现故障,就回滚事务。 *所有在事务内处理的操作不会发生。          */ utx.rollback();        } } catch (Exception e) { /* 在完成事务的过程中出现故障, *仍旧保证 * 事务内的操作不会发生。/        */ // 报告给客户 explanation += "n" + e.getMessage(); //最后,事务不会成功 success = false; } finally { return success;      }    } }

用JOTM向Servlet中添加事务(3)

时间:2011-07-08 csdn博客 newhappy

表示层:在表示层,就用程序由两个 JSP 文件组成:

atm.jsp, 应用程序,它发送给bar.CashDelivery 类客户登录和提款数目,并 显示客户操作的结果 。

admin.jsp,,用于显示和更新两个资源的信息。(它不属于应用程序设计的 部分,但是添加它来简化资源更新,比如处理客户帐户的钱数。)

用JOTM向Servlet中添加事务 - 编程入门网

图1 应用程序设计

配置数据库

关于数据库,建议使用MySQL 4.0.12和相应的 JDBC 驱动程序(见Resources )。默认情况下,MySQL 表不会受影响。为支持事务,表在创建的时候设置为 InnoDB 类型。另外,为启用 InnoDB 类型,您可以将 MySQL 配置文件内的 #skip-innodb 行注释掉。

已配置了一个 MySQL 的例子,用户名为 javauser,密码为 javadude。确保 该用户已被创建并且拥有创建数据库的权限。

创建数据库和表的脚本在 scripts/ 目录下的 example file 内含有。它将创 建一个 account 表并插入两个客户:john_doe 他的帐户金额为 $100。jane_doe 他的帐户金额为 $600。

例2 创建 account 表

mysql> CREATE DATABASE banktest; mysql> USE banktest; mysql> CREATE TABLE account( -> client VARCHAR(25) NOT NULL PRIMARY KEY, -> money INT) TYPE=InnoDB; mysql> INSERT INTO account valueS("john_doe", 100); mysql> INSERT INTO account valueS("jane_doe&q

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号