博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
事务的应用demo1-------采用JDBC硬编码方式模拟"银行转账"。
阅读量:6866 次
发布时间:2019-06-26

本文共 2803 字,大约阅读时间需要 9 分钟。

hot3.png

    1. 数据表-----BANKACCOUNT
create table BANKACCOUNT(  id      VARCHAR2(255) not null,  name    VARCHAR2(255) not null,  balance NUMBER(10))tablespace TS_USER  pctfree 10  initrans 1  maxtrans 255  storage  (    initial 64K    next 1M    minextents 1    maxextents unlimited  );alter table BANKACCOUNT  add primary key (ID)  using index   tablespace TS_USER  pctfree 10  initrans 2  maxtrans 255  storage  (    initial 64K    next 1M    minextents 1    maxextents unlimited  );
    2. 初始数据
    3. Test2.java------------------利用事务模拟简单的"转账"情景
package com.lxh.transaction2;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import com.util.ConnectToDB;public class Test2 {	public Connection conn = null;	public Statement stat = null;	public ResultSet rs = null;	public static void main(String[] args) {		Test2 t = new Test2();		try {			/**			 * 数据库链接操作			 */			Class.forName("oracle.jdbc.driver.OracleDriver");			t.conn = DriverManager.getConnection(					"jdbc:oracle:thin:@127.0.0.1:1521:tran", "test",					"123");			t.stat = t.conn.createStatement();			/********************** 转账 ***************************/			String sql1 = "update bankaccount set balance=3000-1000 where name='lxh'";			String sql2 = "update bankaccount set balance=3000+1000 where name='xiaowu'";			/**			 * 设置非自动提交----------非常重要			 */			t.conn.setAutoCommit(false);			// 批处理			t.stat.addBatch(sql1);			t.stat.addBatch(sql2);			/**			 * 处理执行SQL的结果			 */			int res[] = t.stat.executeBatch();			int result = 1;// 正常执行,返回结果为1			for (int i : res) {				result = i;			}			if (1 == result) {				System.out.println("转账成功。。。");				// 执行结果全部为1的时候执行正确,允许提交				t.conn.commit();				t.conn.setAutoCommit(true);			} else {				// 不符合逻辑,回滚事务				System.out.println("转账失败。。。请核查输入参数");				t.conn.rollback();			}			/********************** 转账 ***************************/		} catch (SQLException e) {			System.out.println("转账失败:\t" + e.getMessage());			try {				// 出现异常回滚(比如数据表名称/字段名称有误,参数有误)				t.conn.rollback();				t.conn.setAutoCommit(true);			} catch (SQLException e1) {				e1.printStackTrace();			}		} catch (ClassNotFoundException e) {			System.out.println(e.getMessage());		} finally {			// 关闭资源----其实就是将资源的关闭封装成类			ConnectToDB.closeResultSet(t.rs);			ConnectToDB.closeStatemet(t.stat);			ConnectToDB.closeConnection(t.conn);		}	}}
    4. 运行结果
       <1>
账户名不存在 ( sql2= "update bankaccount set balance=3000+1000 where name='xiaowu1'")
       <2> SQL语句存在错误( sql2= "update bankaccount set balance=3000+1000 where2 name='xiaowu'")
       <3>
转账信息正确( sql2= "update bankaccount set balance=3000+1000 where name='xiaowu'")
    5. 结果分析
       只有<3>才实现了真正类似于现实生活中的转账操作,说明"事务"在某些特定的数据库操作中的确起到了重要的作用。
    6. 不足之处:转账金额和对方账户是固定的,交互性不强
       升级版本:事务的应用demo2-------采用可交互的JDBC硬编码方式实现银行转账。

转载于:https://my.oschina.net/u/1989867/blog/540897

你可能感兴趣的文章
通过Auto Layout深入了解SizeClasses的好处和使用
查看>>
Spring scope解惑
查看>>
BCH与BCE共享比特币之名
查看>>
js脚本 处理js注入
查看>>
A potentially dangerous Request.Form value was detected from the client
查看>>
测试过程之过分关注功能性测试
查看>>
SQL Server -- LIKE模糊查询
查看>>
centos7.0 docker安装部署
查看>>
ORA-32004错误的解决方法
查看>>
嵌入式系统学习步骤
查看>>
PPT | Docker定义存储-让应用无痛运行
查看>>
django 自定义日志配置
查看>>
是程序员,就用python导出pdf
查看>>
Absolute Uninstaller是类似于标准的Windows添加/删除卸载工具
查看>>
C++ Primer Plus(十)——对象和类
查看>>
ZooKeeper伪分布式集群安装及使用
查看>>
js 页面跳转保存状态
查看>>
轻松应对IDC机房带宽突然暴涨问题
查看>>
Mybatis Interceptor 讲解
查看>>
java mybatis向mysql数据库插入中文出现乱码
查看>>