事務概述事務指的是邏輯上的一組操作(多條sql語句),組成這組操作的各個單元要麼全都成功,要麼全都失敗. 事務的作用保證在一個事務中多次操作要麼全都成功,要麼全都失敗. mysql事務操作Connection介面中有和事務有關的方法: void setAutoCommit(boolean autoC ...
事務概述
事務指的是邏輯上的一組操作(多條sql語句),組成這組操作的各個單元要麼全都成功,要麼全都失敗.
事務的作用
保證在一個事務中多次操作要麼全都成功,要麼全都失敗.
mysql事務操作
Connection介面中有和事務有關的方法:
void setAutoCommit(boolean autoCommit) 將此連接的自動提交模式設置為給定狀態。
autoCommit - 為 true 表示啟用自動提交模式;為 false 表示禁用自動提交模式
要把autoCommit設置為false,讓事務手動開啟
void commit() 如果多條sql都執行成功,提交事務
void rollback() 有一條sql執行失敗,就回滾事務,把數據回滾到開啟事務之前的狀態
代碼實現
1 public class Demo01Account { 2 public static void main(String[] args) { 3 Connection conn = null; 4 Statement stat = null; 5 try { 6 //註冊驅動 7 Class.forName("com.mysql.jdbc.Driver"); 8 //獲取連接 9 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day06", "root", "root"); 10 //開啟事物 11 conn.setAutoCommit(false); 12 //獲取執行者對象 13 stat = conn.createStatement(); 14 int i = stat.executeUpdate("update account set money=money-100 where name='tom'"); 15 int num = 0/0;//tom錢減少了,jerry錢沒有增加 16 int j = stat.executeUpdate("update account set money=money+100 where name='jerry'"); 17 if(i>0 && j>0){ 18 System.out.println("轉賬成功!"); 19 } 20 //提交事物 21 conn.commit(); 22 } catch (Exception e) { 23 e.printStackTrace(); 24 //回滾事物 25 try { 26 conn.rollback(); 27 } catch (SQLException e1) { 28 e1.printStackTrace(); 29 } 30 }finally{ 31 if (stat != null){ 32 try { 33 stat.close(); 34 } catch (Exception e) { 35 e.printStackTrace(); 36 } 37 } 38 if (conn != null){ 39 try { 40 conn.close(); 41 } catch (Exception e) { 42 e.printStackTrace(); 43 } 44 } 45 } 46 47 } 48 }
事務的特性
原子性:強調事務的不可分割.多條語句要麼都成功,要麼都失敗。
一致性:強調的是事務的執行的前後,數據要保持一致.
隔離性:一個事務的執行不應該受到其他事務的干擾.
持久性:事務一旦結束(提交/回滾)數據就持久保持到了資料庫.
如果不考慮事務的隔離性,引發一些安全性問題
臟讀:一個事務讀到另一個事務還沒有提交的數據.
臟讀又稱無效數據的讀出,是指在資料庫訪問中,事務T1將某一值修改,然後事務T2讀取該值,此後T1因為某種原因撤銷對該值的修改,這就導致了T2所讀取到的數據是無效的
不可重覆讀:一個事務讀到了另一個事務已經提交的update的數據,導致在當前的事務中多次查詢結果不一致.
虛讀/幻讀 :一個事務讀到另一個事務已經提交的insert的數據,導致在當前的事務中多次的查詢結果不一致.
解決引發的讀問題
設置事務的隔離級別:級別超高,越安全,效率越低。
1 read uncommitted :未提交讀.臟讀,不可重覆讀,虛讀都可能發生.
2 read committed :已提交讀.避免臟讀.但是不可重覆讀和虛讀有可能發生.(Oracle預設)
4 repeatable read :可重覆讀.避免臟讀,不可重覆讀.但是虛讀有可能發生.(MySql預設)
8 serializable :串列化的.避免臟讀,不可重覆讀,虛讀的發生.