mysql事務隔離最高 Mysql事務隔離級別

2021-10-18 21:54:55 字數 4014 閱讀 6846

mysql官方文件顯示:

innodb中每個隔離級別的詳細描述如下:

· read uncommitted

select語句以非鎖定方式被執行,但是乙個可能更早期版本的記錄會被用到。因此,使用這個隔離級別,比如,讀是不連貫的。著也被稱為「髒讀」(dirty read)。另外,這個隔離級別象read committed一樣作用。

· read committed

持續讀行為如同在oracle中:即使在同一事務內, 每個持續讀設定並讀取它自己的新快照。請參閱15.2.10.4節,「持續非鎖定讀」。

· repeatable read

在持續讀中,有乙個與之前隔離級別重要的差別:在這個級別,在同一事務內所有持續讀讀取由第一次讀所確定的同一快照。這個慣例意味著如果你在同一事務內發出數個無格式select語句,這些select語句對相互之間也是持續的,請參閱15.2.10.4節,「持續非鎖定讀」。

· serializable

這個級別類似repeatable read,但是所有無格式select語句被 隱式轉換成select ... lock in share mode。

1.事務裡一些有問題的讀取:髒讀,不可重複讀,幻象讀

髒讀 (dirty read):事務t1更新了一行記錄的內容,但是並沒有提交所做的修改。事務t2讀取更新後的行,然後t1執行回滾操作,取消了剛才所做的修改。現在t2所讀取的行就無效了。

不可重複讀取 (nonrepeatable read):事務t1讀取一行記錄,緊接著事務t2修改 了t1剛才讀取的那一行記錄。然後t1又再次讀取這行記錄,發現與剛才讀取的結果不同。這就稱為「不可重複」讀,因為t1原來讀取的那行記錄已經發生了變化。

幻像讀取 (phantom read):事務t1讀取一條指定的where子句所返回的結果集。然後事務t2新插入 一行記錄,這行記錄恰好可以滿足t1所使用的查詢條件中的where 子句的條件。然後t1又使用相同的查詢再次對錶進行檢索,但是此時卻看到了事務t2剛才插入的新行。這個新行就稱為「幻像」,因為對t1來說這一行就像突 然出現的一樣。

2.事務的隔離級別

從級別低到高依次為:

read uncommitted (讀取未提交內容):幻像讀、不可重複讀和髒讀都允許。

read committed (讀取已提交內容):允許幻像讀、不可重複讀,但不允許髒讀。

repeatable read (可重讀):允許幻像讀,但不允許不可重複讀和髒讀。innodb預設級別

serializable (可序列化):幻像讀、不可重複讀和髒讀都不允許。

但是innodb的可重複讀隔離級別和其他資料庫的可重複讀是有區別的,不會造成幻象讀(phantom read)。

oracle資料庫支援 read committed 和 serializable ,不支援 read uncommitted 和 repeatable read 。

3、修改事務隔離級別的方法:

全域性修改,修改mysql.ini配置檔案,在最後加上

#可選引數有:read-uncommitted, read-committed, repeatable-read, serializable.

[mysqld]

transaction-isolation = repeatable-read

這裡全域性預設是repeatable-read,其實mysql本來預設也是這個級別

要記住mysql有乙個autocommit引數,預設是on,他的作用是每一條單獨的查詢都是乙個事務,並且自動開始,自動提交(執行完以後就自動結束了,如果你要適用select for update,而不手動呼叫 start transaction,這個for update的行鎖機制等於沒用,因為行鎖在自動提交後就釋放了),所以事務隔離級別和鎖機制即使你不顯式呼叫start transaction,這種機制在單獨的一條查詢語句中也是適用的,分析鎖的運作的時候一定要注意這一點

4、鎖機制:

共享鎖:由讀表操作加上的鎖,加鎖後其他使用者只能獲取該錶或行的共享鎖,不能獲取排它鎖,也就是說只能讀不能寫

排它鎖:由寫表操作加上的鎖,加鎖後其他使用者不能獲取該錶或行的任何鎖,典型是mysql事務中

5、鎖範圍

行鎖: 對某行記錄加上鎖

表鎖: 對整個表加上鎖

這樣組合起來就有:行級共享鎖、表級共享鎖、行級排他鎖、表級排他鎖

6、具體示例

innodb下,開啟2個session對同一表操作,時間線往下順序執行:

1)read-uncommitted(讀取未提交內容)級別

user a             user b

set autocommit=0;      set autocommit=0;

time

|        select * from t;

|        返回空結果

|                        insert into t values (1, 2);

v       select * from t;

返回 1 row in set(user b插入)

rollback;

select * from t;

返回空結果

commit;

so:可以看出read-uncommitted隔離級別,當兩個事務同時進行時,即使事務沒有提交,所做的修改也會對其它事務的查詢做出影響,這種級別顯然很不安全。

2)read-committed(讀取提交內容)級別

user a             user b

set autocommit=0;      set autocommit=0;

time

|        select * from t;

|        返回空結果

|                        insert into t values (1, 2);

v       select * from t;

返回空結果(未更改)

commit;

select * from t;

返回 1 row(userb插入並提交了)

commit;

so:read-committed事務隔離級別,只有在事務提交後,才會對另乙個事務產生影響。

3)repeatable-read(可重讀)

user a             user b

set autocommit=0;      set autocommit=0;

time

|        select * from t;

|        返回空結果

|                        insert into t values (1, 2);

v       select * from t;

返回空結果(未更改)

commit;

select * from t;

返回空結果(仍未更改)

commit;

select * from t;

返回1 row(新啟事務,查詢到修改)

so:repeatable-read(可重讀)事務隔離級別,當兩個事務同時進行時,其中乙個事務修改資料對另乙個事務不會造成影響,即使修改的事務已經提交也不會對另乙個事務造成影響,直到使用新的事務。

4)serierlized(可序列化)

為方便解釋,假設表中已有一條資料

user a             user b

set autocommit=0;

set autocommit=0;

time

|        select * from t;

|        返回1 row

|                        select * from t;

|                       返回1 row

vupdate此行;

被加鎖,等待

so:serierlized(可序列化)事務隔離級別最高,在進行查詢時就會對錶或行加上共享鎖,其他事務對該錶將只能進行讀操作,而不能進行寫操作。

(以上內容含網路摘錄,如有侵犯,多多包涵)

MySQL 事務隔離

未提交讀 read uncommitted 允許髒讀,也就是可能讀取到其他會話中未提交事務修改的資料 提交讀 read committed 只能讀取到已經提交的資料。oracle等多數資料庫預設都是該級別 不重複讀 可重複讀 repeated read 可重複讀。在同乙個事務內的查詢都是事務開始時刻...

Mysql 事務隔離

1 事務的特性 原子性 一致性 隔離性 永續性 2 多事務同時執行的時候,可能會出現的問題 髒讀 不可重複讀 幻讀 3 事務隔離級別 讀未提交 讀提交 可重複讀 序列化 4 不同事務隔離級別的區別 讀未提交 乙個事務還未提交,它所做的變更就可以被別的事務看到 讀提交 乙個事務提交之後,它所做的變更才...

MySQL事務隔離

髒讀 事務a更新了資料但是並未提交,事務b查詢到事務a更新的資料,事務a此時執行回滾操作,事務b讀到的資料是髒資料。不可重複讀 事務a多次讀取同一資料。事務b在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果不一樣。幻讀事務a多次讀取一組資料。事務b在事務a多次讀取的...