您好,登錄后才能下訂單哦!
一、事務的基本概念
數(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(); } } } }
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。