1. 程式人生 > >事務 四大特性 mysql 悲觀鎖與樂觀鎖

事務 四大特性 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

);

  解決丟失更新的方法:在資料表中新增版本欄位,每次修改過記錄後,版本欄位都會更新,如果讀取的版本欄位與修改時不一致,證明被修改過