溫馨提示×

溫馨提示×

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

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

JDBC編程的事務處理

發(fā)布時間:2020-07-24 21:03:39 來源:網(wǎng)絡 閱讀:332 作者:yeleven 欄目:數(shù)據(jù)庫

一、事務的基本概念

    數(shù)據(jù)庫是一個多用戶使用的共享資源。當多個用戶并發(fā)地存取數(shù)據(jù)的時候,在數(shù)據(jù)庫中就會產(chǎn)生多個用戶同時存取同一數(shù)據(jù)的情況。若對并發(fā)操作不加控制,就可能會產(chǎn)生讀取和存儲不正確的數(shù)據(jù),破壞數(shù)據(jù)的一致性。

    而事務是并發(fā)控制的基本單位。所謂事務,即一個操作序列。這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個不可分割的工作單位。比如銀行轉(zhuǎn)賬工作:從一個賬戶扣款,并使用另一個賬戶收款,這兩個操作要么都執(zhí)行,要么都不執(zhí)行,因此應該把它們看作是一個事務。

    事務是數(shù)據(jù)庫維護數(shù)據(jù)一致性的單位,在每個事務結束時,都能保持數(shù)據(jù)的一致性。

    對于編程人員來說,可以把數(shù)據(jù)庫事務看作是一組sql語句,這組sql語句是一個邏輯工作單元,它們是不可分割的,它們的執(zhí)行結果應該作為一個整體永久修改一個數(shù)據(jù)庫的內(nèi)容或者作為一個整體取消對數(shù)據(jù)庫的修改。

    

二、事務的四個基本特征

    1.原子性

    原子性是指事務中包含的操作都被看作是一個邏輯單元,這個邏輯單元中的操作要么全部成功,要么全部失敗。這也意味著事務中的所有元素作為一個整體提交或回滾。事務的所有元素是不可分割的,是一個完整的操作。

    2.一致性

    一致性是指事務開始之前和事務結束以后數(shù)據(jù)庫都處于一致性狀態(tài),數(shù)據(jù)庫的完整性約束沒有被破壞。

     3.隔離性

    隔離性是指對數(shù)據(jù)庫進行修改的多個事務是彼此隔離的。這說明事務必須是獨立的,不應該以任何形式影響其他事務

    4.持久性

    持久性是指事務完成之后對于數(shù)據(jù)庫的影響是永久的,該修改真實地修改了數(shù)據(jù)庫,即使數(shù)據(jù)庫出現(xiàn)故障也會一直保留。


三、與SQL相關的事務語句

    開始事務:BEGIN TRANSACTION

    提交事務:COMMIT TRANSATION

    回滾事務:ROLLBACK TRANSATION    

package com.eduask.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/*將要測試的邏輯
  保存一個用戶Tom的基本信息和Tom的地址信息
  分別通過兩個java方法插入到用戶表和地址表中 
  在插入地址表的時候人為造成一個異常
  觀察結果
 */
public class TransactionTest {
	
	//創(chuàng)建一個getConnection()用來獲取數(shù)據(jù)庫的連接
	public static Connection getConnection(){
		Connection conn = null;
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdemo","root","root");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return conn;
	}
	
	public static void insertUserData(Connection conn) throws SQLException{
			String sql = "insert into tbl_user(id,name,password,email) "
					+ "values(10,'Tom','123456','tom@gmail.com')";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向用戶插入了 "+ count + " 條記錄");
	}
	
	public static void insertAddressData(Connection conn) throws SQLException{
			String sql = "insert into tbl_address(id,city,country,user_id) "
					+ "values(1,'ShangHai','China','10')";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向地址表中插入了 "+ count + " 條記錄");
	}
	
	public static void main(String[] args) {
		Connection conn = null;
		try {
			conn = getConnection();
			conn.setAutoCommit(false);
			
			insertUserData(conn);
			insertAddressData(conn);
			
			conn.commit();
		} catch (SQLException e) {
			System.out.println("=========捕獲到SQL異常=========");
			
			e.printStackTrace();
			try {
				conn.rollback();//回滾事務,保證數(shù)據(jù)庫數(shù)據(jù)的一致性
				System.out.println("=========事務回滾成功=========");
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}finally{
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (Exception e3) {
				e3.printStackTrace();
			}
		}
	}
	
	
}












向AI問一下細節(jié)
推薦閱讀:
  1. JDBC的學習
  2. JDBC

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

AI