您好,登錄后才能下訂單哦!
序號 | 特性 | 描述 |
---|---|---|
1 | 原子性(Atomicity) | 原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。 |
2 | 一致性(Consistency) | 事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。 |
3 | 隔離性(Isolation) | 事務的隔離性是多個用戶并發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個并發事務之間要相互隔離。 |
4 | 持久性(Durability) | 持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響 |
序號 | 方法 | 作用 |
---|---|---|
1 | void setAutoCommit(boolean autoCommit) | 設置事務是否自動提交 如果設置為false,表示手動提交事務。 |
2 | void commit() () | 手動提交事務 |
3 | void rollback() | 回滾(出現異常時候,所有已經執行成功的代碼需要回退到事務開始前的狀態。) |
4 | Savepoint setSavepoint(String name) | 在當前事務中創建一個保存點 |
package com.rk.db.g_transaction; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import com.rk.db.utils.JDBCUtil; /** * // 轉賬,使用事務 * @author RK * */ public class Demo01 { public static void main(String[] args) { Connection conn = null; try { conn = JDBCUtil.getConnection(); // 1、設置事務為手動提交 conn.setAutoCommit(false); boolean flag = true; //表示是否出現SQL異常 transferMoney(conn, 100, "張三", "李四",flag); } catch (SQLException e) { System.out.println("轉賬失敗!"); try { // 2、 出現異常,需要回滾事務 conn.rollback(); System.out.println("回滾操作成功!!!"); } catch (SQLException ex) { ex.printStackTrace(); } } finally { // 3、所有的操作執行成功, 提交事務 try { conn.commit(); System.out.println("執行完畢!"); } catch (SQLException e) { e.printStackTrace(); } JDBCUtil.closeQuietly(conn); } } /** * 模擬銀行轉賬 * @param conn 數據庫連接 * @param moneyNum 轉賬的金額 * @param userAdd 收到Money的用戶 * @param userSub 支出Money的用戶 * @param flag 是否模擬SQL Exception異常,true表示出現,false表示不出現 * @throws SQLException */ private static void transferMoney(Connection conn, long moneyNum, String userAdd, String userSub, boolean flag) throws SQLException { PreparedStatement pstmtAdd = null; PreparedStatement pstmtSub = null; try { String sqlAddMoney = "update T_Bank set money=money+? where username=?"; pstmtAdd = conn.prepareStatement(sqlAddMoney); pstmtAdd.setLong(1, moneyNum); pstmtAdd.setString(2, userAdd); pstmtAdd.executeUpdate(); if(flag) { throw new SQLException("模擬SQL執行出錯"); } String sqlSubMoney = "update T_Bank set money=money-? where username=?"; pstmtSub = conn.prepareStatement(sqlSubMoney); pstmtSub.setLong(1, moneyNum); pstmtSub.setString(2, userSub); pstmtSub.executeUpdate(); } finally { JDBCUtil.closeQuietly(pstmtAdd); JDBCUtil.closeQuietly(pstmtSub); } } }
package com.rk.db.g_transaction; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Savepoint; import com.rk.db.utils.JDBCUtil; /** * // 轉賬,使用事務, 回滾到指定的代碼段 * @author RK * */ public class Demo02 { public static void main(String[] args) { Connection conn = null; Savepoint sp = null; try { conn = JDBCUtil.getConnection(); // 1、設置事務為手動提交 conn.setAutoCommit(false); transferMoney(conn, 1000, "李四", "張三",false); // 如果失敗,回滾到這個位置 sp = conn.setSavepoint(); boolean flag = true; //表示是否出現SQL異常 transferMoney(conn, 500, "張三", "李四",flag); } catch (SQLException e) { System.out.println("轉賬失敗!"); try { // 2、 出現異常,需要回滾 (回滾到指定的代碼段) conn.rollback(sp); System.out.println("回滾到指定位置操作成功!!!"); } catch (SQLException ex) { ex.printStackTrace(); } } finally { // 3、所有的操作執行成功, 提交事務 try { conn.commit(); System.out.println("執行完畢!"); } catch (SQLException e) { e.printStackTrace(); } JDBCUtil.closeQuietly(conn); } } /** * 模擬銀行轉賬 * @param conn 數據庫連接 * @param moneyNum 轉賬的金額 * @param userAdd 收到Money的用戶 * @param userSub 支出Money的用戶 * @param flag 是否模擬SQL Exception異常,true表示出現,false表示不出現 * @throws SQLException */ private static void transferMoney(Connection conn, long moneyNum, String userAdd, String userSub, boolean flag) throws SQLException { PreparedStatement pstmtAdd = null; PreparedStatement pstmtSub = null; try { String sqlAddMoney = "update T_Bank set money=money+? where username=?"; pstmtAdd = conn.prepareStatement(sqlAddMoney); pstmtAdd.setLong(1, moneyNum); pstmtAdd.setString(2, userAdd); pstmtAdd.executeUpdate(); if(flag) { throw new SQLException("模擬SQL執行出錯"); } String sqlSubMoney = "update T_Bank set money=money-? where username=?"; pstmtSub = conn.prepareStatement(sqlSubMoney); pstmtSub.setLong(1, moneyNum); pstmtSub.setString(2, userSub); pstmtSub.executeUpdate(); } finally { JDBCUtil.closeQuietly(pstmtAdd); JDBCUtil.closeQuietly(pstmtSub); } } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。