事務 四大特性 mysql 悲觀鎖與樂觀鎖
事務:
* 事務就是邏輯上的一組操作,要麼全都成功,要麼全都失敗!!!
事務特性:
* 原子性:事務一組操作不可分割.
* 一致性:事務的執行前後,資料完整性要保持一致.
* 隔離性:一個事務在執行的過程中不應該受到其他事務的干擾.
* 永續性:一旦事務結束,資料就永久儲存資料庫.
如果不考慮事務的隔離性引發一些安全性問題:
* 5大類問題:3類讀問題2類寫問題.
* 讀問題:
* 髒讀:一個事務讀到另一個事務未提交資料.
* 不可重複讀:一個事務讀到另一個事務已經提交資料(update),導致查詢結果不一致.
* 虛讀:一個事務讀到另一個事務已經提交的資料(insert),導致查詢結果不一致
* 避免三種讀的問題:
* 設定事務的隔離級別:
* 未提交讀:以上三種讀問題 都有可能發生.
* 已提交讀:避免髒讀,但是不可重複讀和虛讀有可能發生.
* 重複讀:避免髒讀和不可重複讀,但是虛讀是有可能發生.
* 序列的:可以避免以上三種讀問題.
* 在Hibernate中設定事務的隔離級別:
* 在核心配置檔案中:
<property name="hibernate.connection.isolation">4</property>
悲觀鎖 假設丟失更新一定會發生 利用資料庫內部鎖機制,管理事務
mysql資料庫內部提供兩種常用的鎖機制 共享鎖(讀鎖)和排它鎖(寫鎖) 鎖必須在事務中新增,事務結束了鎖就釋放了
允許一張資料表中資料記錄新增多個共享鎖,新增共享鎖記錄,對於其他事務可讀不可寫
可新增一個排他鎖,防止其他事務修改
mysql新增 共享鎖方式 select * from account lock in share mode;
mysql新增 排他鎖方式 select * from account for update;
解決丟失更新的方法:事務在修改記錄過程中,鎖定記錄,別的事務無法併發修改
樂觀鎖 採用記錄的版本欄位,來判斷記錄是否修改過
timestamp 可以自動更新
create table product(
id int,
name varchar(20),
updatetime timestamp
);
解決丟失更新的方法:在資料表中新增版本欄位,每次修改過記錄後,版本欄位都會更新,如果讀取的版本欄位與修改時不一致,證明被修改過