資料庫中的悲觀鎖和樂觀鎖例項

2021-06-19 08:08:30 字數 2635 閱讀 2415

第一次接觸這個名詞,悲觀鎖,不知道是誰起的這樣的名字. 很想知道為什麼叫做悲觀鎖, 自己在占用乙個東西的時候不允許別人碰就是悲觀了(⊙_⊙)?這可能是理智的一種選擇. 當然因為學習和生活即是相同的又是不同的, 我們可以這樣解釋的.

悲觀鎖是對資料的衝突採取一種悲觀的態度, 比如上自習佔座, 假設一定會有人和我搶乙個座位, 我在最開始就把這個座位的時候,我就把這過座位貼上我的標籤, 不允許任何人使用. 而樂觀鎖是我認為不一定有人和我搶座, 只有當我真正的要用到這個座位的時候再去看看這個座位上是否有人.  這就相當於, 有些人在發生一些事的時候總會把事情想壞,有的人則會把事情向好的方面想.

當然在資料庫中我們可以這樣解釋, 悲觀鎖對資料的衝突採取的是一種悲觀的態度, 就是資料肯定會衝突, 所以在開始讀資料的時候就把資料鎖住, 而樂觀鎖就是認為資料一般不會起衝突, 所以在資料進行提交更新的時候, 才會對資料衝突進行檢測, 如果衝突了, 則讓使用者返回錯誤的資訊, 讓使用者決定如何去做. 

哪種情況使用悲觀鎖,哪種情況使用樂觀鎖?

針對資料併發的可能性比較大, 我們用悲觀鎖. 如果併發的可能性比較小, 我們用樂觀鎖.

悲觀鎖例項:

例如我們對oracle中的乙個表進行修改更新操作, 但是在修改的時候首先要從資料庫中讀取出來這條要修改的內容, 悲觀鎖是在讀取這條資料的時候就把表中的這條記錄鎖定, 不允許其他的使用者來讀取.

這樣,我們資料庫中的查詢語句:

string sql="select value from t_table_id where table_name=? for update";

因為我們在連線資料庫,執行操作的時候, 資料庫會自動的提交事務, 我們需要把讀取和更新這條記錄放在乙個事務裡, 所以我們就要手動的去控制, 讓我們讀取更新全部完成的時候再提交事務.

1所以先把事務"開關"自動變手動, 就像開車的時候, 我們有手動擋和自動擋一樣~~~

所以我們在jsp的後台頁面上資料庫工具類中新增方法的**:

自動提交變手動提交事務:

//自己封裝的讓事務變成非自動回滾的函式. .

public static void begintransaction(connection conn)

}}catch(sqlexception e)

}

這裡面有乙個jdbc的引數,  connection的方法setautocommit()方法, true: 表示sql命令提交(commit) 由驅動程式負責    false: sql 命令提交由應用程式負責, 程式必須呼叫commit方法或rollback方法.

提交事務:

//提交事務.

public static void committransaction(connection conn)

}}catch(sqlexception e)

}

回滾事務:

//回滾事務.

public static void rollbacktransaction(connection conn)

}}catch(sqlexception e)

}

恢復我們的設定, 讓事務由手動變為自動, 恢復到最開始的狀態:

//恢復以前的狀態,重置.

public static void resetconnection(connection conn)

else

}}catch(sqlexception e)

}

我們呼叫資料庫操縱類的方法:

/**

* 根據表名生成該錶的序列.

* @param tablename

* @return 返回生成的序列.

*///public static synchronized int generate(string tablename)

public static int generate(string tablename)

//取得當前表的索引值.

value = rs.getint("value");

//自加.

value++;

//更新表索引值..

modifyvaluefield(conn,tablename,value);

//我們完全改完了,就提交事務.

dbutil.committransaction( conn);

}catch(exception e)

finally

return value;

}

以上是悲觀鎖的例項, 而樂觀鎖與悲觀鎖是相對的, 不是在讀取這條資料的時候加鎖而是在更新這條資料的時候加鎖. 就相當於兩個管理員同時在修改乙個公司職員的資訊時, 悲觀鎖是不允許同時修改的, 而樂觀鎖, 他們可以同時修改, 並且以最先儲存結果的人為最後的儲存結果, 同時通知另乙個管理員無法儲存的事實.

資料庫中的悲觀鎖和樂觀鎖

當我們要對乙個資料庫中的一條資料進行修改的時候,為了避免同時被其他人修改,最好的辦法就是直接對該資料進行加鎖以防止併發。這種借助資料庫鎖機制在修改資料之前先鎖定,再修改的方式被稱之為悲觀併發控制 又名 悲觀鎖 pessimistic concurrency control,縮寫 pcc 之所以叫做悲...

資料庫的悲觀鎖和樂觀鎖

資料庫的四種隔離級別 髒讀 不可重複讀 可重複讀 序列化,雖然四種隔離級別能夠處理事務問題,但是不夠靈活,於是有了悲觀鎖和樂觀鎖。悲觀鎖 對於外界的修改持保守態度,在整個資料處理中資料處於鎖定狀態。以mysql為例,select for update和lock in share model能夠實現悲...

資料庫的悲觀鎖和樂觀鎖

悲觀鎖就是對資料的衝突持悲觀態度,也就是假設資料肯定會發生衝突,所以在資料開始讀取的時候就把資料鎖定住。書籍表book,id為商品id 主鍵 isonline是否上線,1代表上線,0代表下線,那麼我們如果要對書籍進行下線,就需要將online置為0,假設id為1 如果不採用鎖 1 select fr...