文档章节

事务的应用demo1-------采用JDBC硬编码方式模拟"银行转账"。

绿林小子
 绿林小子
发布于 2015/12/08 14:41
字数 528
阅读 75
收藏 0
    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硬编码方式实现银行转账。

© 著作权归作者所有

绿林小子
粉丝 5
博文 131
码字总数 45566
作品 0
福州
私信 提问
事务的应用demo2-------采用可交互的JDBC硬编码方式模拟"银行转账"

数据表-----BANKACCOUNT create table BANKACCOUNT(id VARCHAR2(255) not null,name VARCHAR2(255) not null,balance NUMBER(10))tablespace TS_USERpctfree 10initrans 1maxtrans 255storag......

绿林小子
2015/12/08
43
0
Spring事务管理的四种方式(以银行转账为例)

本文配套示例代码下载地址(完整可运行,含sql文件,下载后请修改数据库配置):http://download.csdn.net/detail/daijin888888/9567096 一、事务的作用 将若干的数据库操作作为一个整体控制...

梁金晶
2017/10/31
0
0
Java程序员从笨鸟到菜鸟之(六十五)细谈Hibernate(十六)数据库事务与隔离级别

数据库事务:事务是指一组相互依赖的操作行为,如银行交易、股票交易或网上购物。事务的成功取决于这些相互依赖的操作行为是否都能执行成功,只要有一个操作行为失败,就意味着整个事务失败。...

长平狐
2012/11/12
69
0
Java原理 事务的ACID是指什么?

Java原理 事务的ACID是指什么?一、什么是Java事务通常的观念认为,事务仅与数据库相关。事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 ...

勇往直前的麻雀
2017/10/20
0
0
Spring编程式和声明式事务实例讲解

Java面试通关手册(Java学习指南):https://github.com/Snailclimb/JavaGuide 历史回顾: 可能是最漂亮的Spring事务管理详解 Spring事务管理 Spring支持两种方式的事务管理: 编程式事务管理...

snailclimb
2018/05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
多线程同时加载缓存实现

import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorServi......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部