1. 程式人生 > 其它 >mysql髒寫、髒讀、幻讀、不可重複讀問題驗證

mysql髒寫、髒讀、幻讀、不可重複讀問題驗證

0 相關資料 || 知識

1. mysql版本

2. 表格及資料

/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` INT(11) NOT NULL,
  `name` VARCHAR(32) DEFAULT NULL,
  `desc` VARCHAR(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

/*Data for the table `user` 
*/ INSERT INTO `user`(`id`,`name`,`desc`) VALUES (1,'路人甲',NULL), (2,'路人乙',NULL);

3. 資料庫隔離級別

Read Uncommitted(讀取未提交內容): 存在髒讀 Read Committed(讀取提交內容):存在不可重複讀 Repeatable Read(可重讀):存在幻讀 Serializable(可序列化):隔離級別最高,不存在前面的所有情況,因為序列執行,效率最低

4. 隔離級別檢視和設定

//檢視當前事物級別:
SELECT @@tx_isolation;
//設定mysql的隔離級別:
set session transaction
isolation level 設定事務隔離級別 //設定read uncommitted級別: set session transaction isolation level read uncommitted; //設定read committed級別: set session transaction isolation level read committed; //設定repeatable read級別: set session transaction isolation level repeatable read; //設定serializable級別: set session transaction
isolation level serializable;

1 髒寫

1. 定義:事務A和事務B同時更新一條記錄,一個事務回滾導致另一個事務的改動丟失 2. 隔離級別設定:set session transaction isolation level read uncommitted; 由於innodb在update時,會加行鎖, 事務1沒結束,事務2的update會阻塞,天然避免了髒寫

2 髒讀

1. 定義:讀取到了事務未提交改動 2. 設隔離級別設定:set session transaction isolation level read uncommitted; 3. 視窗1為事務執行視窗,視窗2為觀察視窗 4.怎麼避免:將mysql隔離級別設定成read committed及以上,或者加行鎖

3.不可重複讀

1. 定義:在事務中多次查詢同一條資料,得到結果不一樣 2. 設隔離級別設定:set session transaction isolation level read committed; 3. 視窗1為執行視窗,視窗2為觀察視窗 4.怎麼避免:將mysql隔離級別設定成repeatable read及以上

4.幻讀

1. 定義:在事務中多次查詢同一張表資料,得到結果不一樣 2. 設隔離級別設定:set session transaction isolation levelread committed; 3. 視窗1為事務執行視窗,視窗2為觀察視窗 4.怎麼避免:將mysql隔離級別設定成repeatable read及以上,或加表鎖 5.事務開啟時,未執行select時,表資料改動生效,一旦執行select,會生成表格快照,查詢不到改動

參考:

大白話講解髒寫、髒讀、不可重複讀和幻讀

mysql事務隔離級別與設定

【MySQL】當前讀、快照讀、MVCC

Become a Linux Programmer