未知驅動學習 資料庫中的悲觀鎖和樂觀鎖例項

2021-06-18 06:36:25 字數 2774 閱讀 2723

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

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

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

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

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

悲觀鎖例項:

例如我們對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;

}

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

拋開計算機的世界, 你喜歡哪種性格的人呢?悲觀?樂觀? 我想做人要樂觀, 做事要悲觀. 做事我們必須要把壞結果提前想到, 並且做出一些必要的措施, 您說呢?

資料庫的樂觀鎖和悲觀鎖

悲觀鎖 假定會發生併發衝突,遮蔽一切可能違反資料完整性的操作,假設資料肯定會衝突,所以在資料開始讀取的時候就把資料鎖定住。資料鎖定 資料將暫時不會得到修改 樂觀鎖 假設不會發生併發衝突,只在提交操作時檢查是否違反資料完整性。資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則...

資料庫 悲觀鎖

悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保...

資料庫 (2)樂觀鎖和悲觀鎖

併發控制手段 樂觀鎖 樂觀併發控制 悲觀鎖 悲觀併發控制 悲觀鎖 當我們要對乙個資料庫中的一條資料進行修改的時候,為了避免同時被其他人修改,最好的辦法就是對該資料進行加鎖以防止併發。這種借助資料庫鎖機制在修改資料之前先鎖定,再修改的方式稱之為悲觀併發控制。悲觀併發控制實際上是 先取鎖再訪問的保守策略...