事務併發產生的問題:
髒讀:乙個事務讀取到了另外乙個事務沒有提交的資料
事務1:更新一條資料
------------->事務2:讀取事務1更新的記錄
事務1:呼叫commit進行提交
***此時事務2讀取到的資料是儲存在資料庫記憶體中的資料,稱為髒讀。
***讀到的資料為臟資料
詳細解釋:
髒讀就是指:當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,
另外乙個事務也訪問這個資料,然後使用了這個資料。因為這個資料是還沒有提交的資料,那麼另外乙個
事務讀到的這個資料是髒資料,依據髒資料所做的操作可能是不正確的。
不可重複讀:在同一事務中,兩次讀取同一資料,得到內容不同
事務1:查詢一條記錄
-------------->事務2:更新事務1查詢的記錄
-------------->事務2:呼叫commit進行提交
事務1:再次查詢上次的記錄
***此時事務1對同一資料查詢了兩次,可得到的內容不同,稱為不可重複讀
幻讀:同一事務中,用同樣的操作讀取兩次,得到的記錄數不相同
事務1:查詢表中所有記錄
-------------->事務2:插入一條記錄
-------------->事務2:呼叫commit進行提交
事務1:再次查詢表中所有記錄
***此時事務1兩次查詢到的記錄是不一樣的,稱為幻讀
詳細解釋:
幻讀是指當事務不是獨立執行時發生的一種現象,例如第乙個事務對乙個表中的資料進行了修改,
這種修改涉及到表中的全部資料行。同時,第二個事務也修改這個表中的資料,這種修改是向表
中插入一行新資料。那麼,以後就會發生操作第乙個事務的使用者發現表中還有沒有修改的資料行,
就好象發生了幻覺一樣。
處理以上隔離級別的問題,採用如下方是:
事務隔離五種級別:
transaction_none 不使用事務。
transaction_read_uncommitted 允許髒讀。
transaction_read_committed 防止髒讀,最常用的隔離級別,並且是大多數資料庫的預設隔離級別
transaction_repeatable_read 可以防止髒讀和不可重複讀,
transaction_serializable 可以防止髒讀,不可重複讀取和幻讀,(事務序列化)會降低資料庫的效率
以上的五個事務隔離級別都是在connection介面中定義的靜態常量,
使用settransactionisolation(int level) 方法可以設定事務隔離級別。
如:con.settransactionisolation(connection.repeatable_read);
注意:事務的隔離級別受到資料庫的限制,不同的資料庫支援的的隔離級別不一定相同
1 髒讀:修改時加排他鎖,直到事務提交後才釋放,讀取時加共享鎖,讀取完釋放事務1讀取資料時加上共享鎖後(這 樣在事務1讀取資料的過程中,其他事務就不會修改該資料),不允許任何事物操作該資料,只能讀取,之後1如果有更新操作,那麼會轉換為排他鎖,其他事務更 無權參與進來讀寫,這樣就防止了髒讀問題。
但是當事務1讀取資料過程中,有可能其他事務也讀取了該資料,讀取完畢後共享鎖釋放,此時事務1修改資料,修改 完畢提交事務,其他事務再次讀取資料時候發現資料不一致,就會出現不可重複讀問題,所以這樣不能夠避免不可重複讀問題。
2 不可重複讀:讀取資料時加共享鎖,寫資料時加排他鎖,都是事務提交才釋放鎖。讀取時候不允許其他事物修改該資料,不管資料在事務過程中讀取多少次,資料都是一致的,避免了不可重複讀問題
解決併發問題
一.使用redis鎖 智慧型雲 工單系統 搶單 工單id鎖key public static final string cloud live gain order lock orderid cloud live gain order lock orderid component public cla...
redis解決併發問題
用redis處理高併發是個很常見的方式,因為redis的訪問效率很高 直接訪問記憶體 一般我們會用來處理 一瞬間的併發量。那如果要使用redis來進行高併發問題的解決的話,應注意以下幾點 1 首先我們要先知道,我們在儲存時,應使用redis的setnx方法,不應該使用set方法,因為setnx擁有原...
Synchronize讀髒解決
對於業務需要同步的 同時,新增synchronize關鍵字 比如,在getvalue setvalue方法上 都加上synchronize關鍵字 保證,業務的一致性 package com.bjsxt.base.sync004 業務整體需要使用完整的synchronized,保持業務的原子性。pub...