1、事務定義:同生共死、同時成功或者失敗的一組操作數據的操作;
2、設置手動提交事務:set autocommit = 0;? savepoint(回滾點);? rollback(回滾); commit(提交);
3、mysql 默認是自動體積事務,也就是一句sql是一個事務;oracle默認手動提交事務,
4、原子性:每個事務是一個原子
一致性:事務中減少和增加保持整體的一致性
隔離性:當事務操作過程中,對別的事務存在隔離性
持久性:事務提交后數據被持久到數據庫,不能還原
5、數據庫不設置隔離級別容易存在的錯誤:
臟讀:讀到別的事務中未提交的數據
虛度:同一事務中先后兩次查詢的數量是不一致的
不可重復讀:同一個事務中讀到數據是不一致的(存在別的事務update的數據)
6、數據庫為了解決三中隔離性問題提供了四種隔離級別:
Serializable( 序列):事務完全隔離,不支持臟讀、虛度、不可重復讀
Repeatable Read: mysql默認支持隔離級別,支持虛度,不支持不可重復讀和臟讀
Read Commited: oracle默認支持隔離級別,支持虛度、不可重復讀,不支持臟讀
Read Uncommited : 支持臟讀、虛度、不可重復讀
7、關于丟失更新問題常見兩種解決辦法:
1):悲觀鎖:假設發生丟失的幾率很大----利用數據庫內部鎖機制
?常見數據鎖:讀鎖(共享鎖)、寫鎖(排他鎖)
* * 一條數據可以有多個讀鎖(共享鎖),但一條數據只能有一個寫鎖(寫鎖和任何鎖都互斥)
* * 數據修改會自動添加排他鎖,
* * 加鎖結合事務使用,事務中加鎖,當事務結束鎖自動釋放。
2):樂觀鎖
利用數據庫記錄版本號區分數據是否被修改,timestemp會自動更新