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硬編碼方式實現銀行轉帳。