亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JDBC系列:(7)使用Connection操作事務

發布時間:2020-05-20 04:45:19 來源:網絡 閱讀:598 作者:lsieun 欄目:數據庫
事務ACID特性
序號特性描述
1原子性(Atomicity)原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。
2一致性(Consistency)事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。
3隔離性(Isolation)事務的隔離性是多個用戶并發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個并發事務之間要相互隔離。
4持久性(Durability)持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響




Connection操作事務的相關方法
序號方法作用
1void setAutoCommit(boolean autoCommit)設置事務是否自動提交
如果設置為false,表示手動提交事務。
2void commit() ()手動提交事務
3void rollback()回滾(出現異常時候,所有已經執行成功的代碼需要回退到事務開始前的狀態。)
4Savepoint setSavepoint(String name)在當前事務中創建一個保存點


1、使用事務

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);
		}

	}
}



2、使用事務,回滾到指定的代碼段

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);
		}

	}
}





向AI問一下細節
推薦閱讀:
  1. JDBC操作
  2. Java JDBC事務

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岳阳市| 镇原县| 黔南| 苍溪县| 扶沟县| 潜山县| 广昌县| 和田市| 孝感市| 温泉县| 北安市| 上思县| 皮山县| 河曲县| 济南市| 邵阳市| 安龙县| 永善县| 德格县| 出国| 图木舒克市| 长子县| 平潭县| 灵川县| 南澳县| 东山县| 晋州市| 永胜县| 甘洛县| 浙江省| 娱乐| 钟山县| 隆尧县| 英德市| 静乐县| 澄迈县| 东明县| 天水市| 于都县| 南充市| 麻阳|