Oracle 與 MySQL 的差別分析(9):事務數據庫
1 自動提交微信
1.1Oracle session
默認不會自動提交,須要顯式的提交或回滾。若是斷開鏈接時有未提交事務,客戶端工具通常能夠配置自動提交或回滾。併發
1.2 MySQL工具
InnoDB支持事務,默認是自動提交的。優化
關閉自動提交的方法:spa
(1)會話級關閉:.net
set autocommit = 0; // 1表示開啓blog
檢查是否關閉:索引
show variables like 「autocommit」;
結果:autocommit OFF
(2)全局關閉:
set global autocommit = 0 或者把 autocommit=0 加到參數文件中。
注:在開啓自動提交狀況下,能夠用starttransaction; 開啓一個事務,而後就不會自動提交了。
2 鎖級別
2.1Oracle
DML語句產生行鎖,鎖信息保存在數據塊上,只有被更新的數據會被鎖定。
2.2 MySQL
不一樣引擎使用不一樣的鎖級別,InnoDB默認也是行鎖,可是它鎖定的是索引條目,這一點與Oracle顯著不一樣,若是沒有經過索引來更新數據的話,那麼就會鎖定整個表。須要注意:
(1)雖然查詢列上有索引,可是優化器仍然可能選擇全表掃描,因爲沒有經過索引訪問數據,此時仍然是表鎖(鎖定全部數據)。
(2)經過A索引查出的數據,雖然被B條件過濾掉了,可是該數據仍然會被鎖定。好比,userid = 1and username = ‘a’ 若是是走了userid的索引,雖然沒有更新username = ‘b’的數據,可是試圖經過userid = 1and username = ‘b’ 更新數據時也會被阻塞。
(3)若是經過userid > 1 來更新數據,而且走userid的索引,那麼會鎖定全部userid >1 的數據,包括未插入的數據,因此此時insert一條userid = 100 的數據時也會被阻塞。這一點與Oracle很不一樣,Oracle的insert語句通常不會被阻塞。
3 事務隔離級別
SQL標準中定義的隔離級別,隔離級別越高,併發性越差。
(1)Read Uncommitted:
B會話能夠看到A會話未提交事務修改的數據(髒數據)。
(2)Read Commited:
A會話的事務提交了,B會話就能夠看到修改的數據。
能夠避免髒讀(讀到未提交的數據)。
(3)Repeatable:
A會話的一個事務內查詢同一個表的數據不會變化,即便B會話修改了數據而且已經提交。
能夠避免不可重複讀問題(同一個SQL第二次發現數據已變化)。
(4)Serializable:
事務好像是串行的,它是在每一個讀的數據上加上共享鎖。select至關於select ... from update。
能夠避免幻影讀問題(同一個SQL第二次讀/寫不會看到新的數據)。
3.1Oracle
默認隔離級別是Read Commited,支持Serializable,不過通常不用。
3.2 MySQL
InnoDB默認事務隔離級別是Repeatable,其它幾種也支持。
查詢事務隔離級別:
select @@tx-isolation;
結果:REPEATABLE-READ
修改方法:
set session|global tx-isolation = ‘serializable’;
4 鎖超時時間
4.1Oracle
若是A會話鎖定了某條數據,那麼B會話試圖更新這條數據時會被阻塞,而且會一直等待。
4.2 MySQL
MySQL數據庫參數:innodb_lock_wait_timeout設置鎖等待的時間是50s,一旦數據庫鎖超過這個時間就會報超時錯誤。
默認值有些小,建議改大些,代碼須要考慮這個特性,鎖定數據有失敗的風險,須要捕獲異常,這一點與Oracle不一樣。
本文分享自微信公衆號 - 微光點亮星辰(SandTower)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。