事務指邏輯上的一組操作,組成這組操作的各個單元,要麼全成功,要麼全不成功。
a,mysql引擎是支持事務的
b,mysql默認自動提交事務。每條語句都處在單獨的事務中。
c,手動控制事務
開啟事務:begin;
提交事務:commit;
回滾事務:rollback;
Connection conn=null; PreparedStatement ps=null; try{ conn=DBUtil.getConnection(); conn.setAutoCommit(false);//相當於begin ps=conn.prepareStatement("update account set money=money-100 where id=1"); ps.executeUpdate(); int i=1/0;//測試如果中途出現異常,第一條sql會不會執行 ps=conn.prepareStatement("update account set money=money+100 where id=2"); ps.executeUpdate();
conn.commit(); }catch(Exception e){ if(conn!=null){ conn.rollback(); } }
原子性:指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
一致性:事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。轉賬前和轉賬後的總金額不變。
隔離性:事務的隔離性是多個用戶並發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個並發事務之間要相互隔離。
持久性:指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。
贓讀:指一個事務讀取了另一個事務未提交的數據。
不可重復讀:在一個事務內讀取表中的某一行數據,多次讀取結果不同。一個事務讀取到了另一個事務提交後的數據。(update)
虛讀(幻讀):是指在一個事務內讀取到了別的事務插入的數據,導致前後讀取不一致。 (insert)
數據庫通過設置事務的隔離級別防止以上情況的發生:
* 1、READ UNCOMMITTED: 贓讀、不可重復讀、虛讀都有可能發生。
* 2、READ COMMITTED: 避免贓讀。不可重復讀、虛讀都有可能發生。(oracle默認的)
* 4、REPEATABLE READ:避免贓讀、不可重復讀。虛讀有可能發生。(mysql默認)
* 8、SERIALIZABLE: 避免贓讀、不可重復讀、虛讀。
級別越高,性能越低,數據越安全
mysql中:
查看當前的事務隔離級別:SELECT @@TX_ISOLATION;
更改當前的事務隔離級別:SET TRANSACTION ISOLATION LEVEL 四個級別之一。
設置隔離級別必須在事務之前。