我所理解的髒讀,不可重複讀和幻讀。
髒讀:某個事務已更新乙份資料,另乙個事務在此時讀取了同乙份資料,由於某些原因,前乙個事務會滾了操作,導致髒讀產生。
不可重複讀:在乙個事務的兩次查詢中資料不一致,可能是兩次查詢過程中插入了乙個事務更新原有的資料。
幻讀:在乙個事務的兩次查詢中資料筆數不一致,例如有乙個事務查詢了幾行資料,而另乙個卻在兩次查詢中插入了新的幾列資料。
以下為原文。
悲觀鎖就是一種真正的鎖了,它會在獲取資源前對資源進行加鎖,確保同一時刻只有有限的執行緒能夠訪問該資源,其他想要嘗試獲取資源的操作都會進入等待狀態,直到該執行緒完成了對資源的操作並且釋放了鎖後,其他執行緒才能重新操作資源;
互斥鎖(寫鎖):允許事務對一條行資料進行刪除或更新;
意向互斥鎖:事務想要在獲得表中某些記錄的互斥鎖,需要在表上先加意向互斥鎖;
create
table
users(
idint
notnull auto_increment,
last_name varchar(255) not
null,
first_name varchar(255),
age int,
primary key(id),
key(last_name),
key(age)
);
+------+-------------+--------------+-------+
|id |last_name |first_name |age |
|------+-------------+--------------+-------|
|4 |stark |tony |21 |
|1 |tom |hiddleston |30 |
|3 |morgan |freeman |40 |
|5 |jeff |dean |50 |
|2 |donald |trump |80 |
+------+-------------+--------------+-------+
(-∞, 21]
(21, 30]
(30, 40]
(40, 50]
(50, 80]
(80, ∞)
read commited
:只對記錄加記錄鎖,而不會在記錄之間加間隙鎖,所以允許新的記錄插入到被鎖定記錄的附近,所以再多次使用查詢語句時,可能得到不同的結果(non-repeatable read);
repeatable read
:多次讀取同一範圍的資料會返回第一次查詢的快照,不會返回不同的資料行,但是可能發生幻讀(phantom read);
serializable
:innodb 隱式地將全部的查詢語句加上共享鎖,解決了幻讀的問題;
create
table
test(
idint
notnull,
unique(id)
);
Mysql 鎖 隔離級別
1.共享鎖 只要有乙個人 事務或執行緒 在查詢,其他人就都不能改,要照顧少數 下面是將所有性別是男的資料都加上共享鎖 select from table where 男 lock in share mode2.排他鎖 只要有乙個人 事務或執行緒 在用 增刪改差 其他人就不能用 下面是將所有性別是男的...
mysql 鎖,隔離級別
1.鎖是對多執行緒,多程序訪問同一資源進行協調的機制 2.分為行鎖,表鎖,頁鎖。myisam和memory支援表鎖,bdb引擎支援表鎖,頁鎖。innodb支援表鎖,行鎖 預設 3.myisam表鎖 4.myisam併發插入 5.讀寫操作同時爭搶鎖,寫鎖優先,可以設定寫鎖優先順序降低,low prio...
SQLserver鎖和事務隔離級別的比較與使用
來自 物件 鎖 每條sql 語句 隔離 事務 鎖 併發問題 丟失更新 未確認的讀取 髒讀 不一致的分析 非重複讀 多次讀取相同的資料 行 不一致 其他使用者更改update 幻像讀 多次讀取有不存在和新增的資料 其他使用者插入insert 或刪除delete 隔離級別 隔離級別 髒讀 不可重複讀取 ...