事務的應用demo1-------採用JDBC硬編碼方式模擬"銀行轉帳"。

    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硬編碼方式實現銀行轉帳。
相關文章
相關標籤/搜索