(提交讀)html
瞭解了以前 READ UNCOMMITTED
隔離級別是如何加鎖的, 而且在文章中, 已經知道 READ COMMITTED
隔離級別能夠解決髒讀的問題, 那接下來, 對於 READ COMMITTED
隔離級別, 試想一下若是讓你用鎖來設計, 你會怎麼作?mysql
READ COMMITTED
隔離級別能夠解決髒讀
的問題, 也就是他可讓事務只能讀其餘事務已提交的的記錄。READ COMMITTED
隔離級別的效果, 也就避免了髒讀
, 但問題是這是一種很低效的作法, 由於對於大部分應用來講, 讀操做是多於寫操做的, 當寫操做加鎖時, 那麼讀操做所有被阻塞, 這樣在大用戶量高併發的狀況下, 會直接下降數據庫的讀效率。數據表結構以下:sql
mysql> select * from test_transaction; +----+---------------+-----+--------+--------------------+ | id | user_name | age | gender | desctiption | +----+---------------+-----+--------+--------------------+ | 1 | 金剛狼 | 127 | 2 | 我有一雙鐵爪 | | 2 | 鋼鐵俠-rym | 120 | 1 | 我有一身鐵甲 | | 3 | 綠巨人 | 0 | 2 | 我有一身肉 | +----+---------------+-----+--------+--------------------+ 3 rows in set (0.00 sec) mysql>
從新設置客戶端1
事務隔離級別爲read committed: SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
數據庫
mysql> SELECT @@SESSION.tx_isolation; +------------------------+ | @@SESSION.tx_isolation | +------------------------+ | REPEATABLE-READ | +------------------------+ 1 row in set (0.00 sec) mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@SESSION.tx_isolation; +------------------------+ | @@SESSION.tx_isolation | +------------------------+ | READ-COMMITTED | +------------------------+ 1 row in set (0.00 sec) mysql>
客戶端2
並設置事務隔離級別爲read committed;客戶端1
中打開事務, 而後更改數據, 先不提交; 而後在客戶端2
中打開事務, 讀取客戶端1
中還沒有提交的那條被修改數據客戶端2
中能夠正常讀取到那條數據, 只不過, 那條數據並非被客戶端1
事務中修改後的數據, 而是最初的穩定數據
, 這就避免了髒讀
!!對於該隔離級別修改數據時使用的鎖類型, 其分析方法, 和以前一篇MySQL(INNODB引擎)事務READ UNCOMMITTED隔離級別和鎖的關係 是同樣的:segmentfault
客戶端1
的事務在修改數據而且未提交時, 在客戶端2
中對同一數據進行修改, 而後在客戶端2
阻塞階段經過查看錶的加鎖狀況: select * from information_schema.INNODB_LOCKS;
, 事務狀態: select * from information_schema.INNODB_TRX;
,客戶端2
的修改語句會鎖等待~