標籤:
/*本次高並發解決之道1,更改交易隔離等級為 read uncommitted讀未提交2,查詢前設定延遲,延遲時間為隨機 50-500 微秒3,修改資料前將 超範圍作為 限定修改條件事務是作為單個邏輯工作單元執行的一系列操作.可以是一條SQL語句也可以是多條SQL語句.一個支援事務 Transaction的資料庫系統,必需要具有這四種特性,以保證保證資料的正確性事務的隔離等級隔離等級與並發性是互為矛盾的:隔離程度越高,資料庫的並發性越差;隔離程度越低,資料庫的並發性越好。隔離等級 髒讀 不可重複讀取 幻讀讀未提交(Read uncommitted) 可能 可能 可能讀已提交(Read committed) 不可能 可能 可能可重複讀(Repeatable read) 不可能 不可能 可能可序列化(Serializable ) 不可能 不可能 不可能髒讀(Dirty Read)當事務讀取還未被提交的資料時,就會發生這種事件。舉例來說:Transaction1修改了一行資料,然後Transaction2在 Transaction1還未提交修改操作之前讀取了被修改過的資料。如果Transaction1復原了修改操作,那麼Transaction2讀取的資料就可以看作是從未存在過的。不可重複讀取(NonRepeatable Read)一個事務範圍內兩個相同的查詢卻返回了不同資料。這是由於查詢時系統中其他事務修改資料後提交而引起的。比如事務Transactio1讀取某一資料,事務Transaction2讀取並修改了該資料後提交,Transaction1為了對讀取值進行檢驗而再次讀取該資料,便得到了不同的結果。幻讀(Phantom Read)如果符合搜尋條件的一行資料在後面的讀取操作中出現,但該行資料卻不屬於最初的資料,就會發生這種事件。舉例來說Transactio1讀取滿足某種搜尋條件的一些行,然後Transaction2插入了符合Transaction1的搜尋條件的一個新行。如果Transaction1重新執行相同查詢及條件,就會得到不同的行Read Uncommitted (Oracle不支援)最低等級的事務隔離,僅僅保證了讀取過程中不會讀取到非法資料。上訴4種不確定情況均有可能發生。與READ COMMITTED 隔離級相反它允許讀取已經被其它使用者修改但尚未提交確定的資料限制層級最小,髒讀在這個隔離等級下是非Consistent Reads的Read Committed (SQL Server, Oracle預設)大多數主流資料庫的預設事務等級,保證了一個事務不會讀到另一個並行事務已修改但未提交的資料,避免了"髒讀取",該層級適用於大多數系統.Repeatable Read (MySQL預設,Oracle不支援)保證了一個事務不會修改已經由另一個事務讀取但未提交(復原)的資料。避免了“髒讀取”和“不可重複讀取”的情況,但是帶來了更多的效能損失。Serializable (Oracle中Read only和這個很相似,唯一區別是Read only事務不允許修改,因此不會遇到ORA-08177錯誤)最高等級的事務隔離,上面3種不確定情況都將被規避。這個層級將類比事務的串列執行。-- updated 2009-09-15 from《Expert Oracle Database Architecture》P239這是最大的限制,和X鎖類似,不允許其他事務進行任何寫訪問。如非必要,不要使用這個選項。在事務的開始使用這個命令即可,該隔離等級一直對該SQL Server串連(不是本事務)有效,直到下一次使用本命令設定了新的隔離等級為止。*/-- 以下4種隔離等級都會以建立事務的測試步驟來進行測試-- 開始事務:start transaction-- 設定會話事務層級:set session transaction isolation level ( read uncommitted / read committed / repeatable read / serializable )-- 提交事務:commit-- 復原事務:rollbackSET TRANSACTION ISOLATION LEVEL -- 只能在開啟事務前執行SET SESSION TRANSACTION ISOLATION LEVEL -- 可以在開啟事務後執行-- 髒讀(Dirty Read)-- 使用者1操作START TRANSACTION;SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;UPDATE t1 SET test_str = ‘測試內容2‘ WHERE id = 1;-- 使用者2操作START TRANSACTION;SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;SELECT * FROM t1 WHERE id = 1;-- 使用者1操作ROLLBACK;-- 使用者2操作SELECT * FROM t1 WHERE id = 1;ROLLBACK;-- 不可重複讀取(NonRepeatable Read)-- 使用者1操作START TRANSACTION;SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;SELECT * FROM t1 WHERE id = 1;-- 使用者2操作START TRANSACTION;SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;UPDATE t1 SET test_str = ‘修改後的測試內容‘ WHERE id = 1;COMMIT;-- 使用者1操作SELECT * FROM t1 WHERE id = 1;ROLLBACK;-- 幻讀(Phantom Read)-- 使用者1操作START TRANSACTION;SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;SELECT * FROM t1;-- 使用者2操作START TRANSACTION;SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;INSERT INTO `test`.`t1` (`storage_num`, `test_str`) VALUES (‘0‘, ‘測試內容1‘);-- 使用者1操作SELECT * FROM t1;ROLLBACK;-- 使用者2操作ROLLBACK;
事務的隔離等級及mysql對應操作