MYSQL select時鎖定記錄問題

來源:互聯網
上載者:User

標籤:

在使用SQL時,大都會遇到這樣的問題,你Update一條記錄時,需要通過Select來檢索出其值或條件,然後在通過這個值來執行修改操作。

但當以上操作放到多線程中並發處理時會出現問題:某線程select了一條記錄但還沒來得及update時,另一個線程仍然可能會進來select到同一條記錄。

 

一般解決辦法就是使用鎖和事物的聯合機制:

如:

1. 把select放在事務中, 否則select完成, 鎖就釋放了。
2. 要阻止另一個select, 則要手工加鎖, select 預設是共用鎖定, select之間的共用鎖定是不衝突的, 所以, 如果只是共用鎖定, 即使鎖沒有釋放, 另一個select一樣可以下共用鎖定, 從而select出資料。

BEGIN TRAN
SELECT * FROM table WITH(TABLOCKX)

或者 SELECT * FROM table WITH(UPDLOCK, READPAST) 具體情況而定。

UPDATE ....
COMMIT TRAN

 

鎖描述:
HOLDLOCK:將共用鎖定保留到事務完成,而不是在相應的表、行或資料頁不再需要時就立即釋放鎖。HOLDLOCK 等同於 SERIALIZABLE。 
NOLOCK 不要發出共用鎖定,並且不要提供排它鎖。當此選項生效時,可能會讀取未提交的事務或一組在讀取中間復原的頁面。有可能發生髒讀。僅應用於 SELECT 語句。 
PAGLOCK:在通常使用單個表鎖的地方採用頁鎖。 
READCOMMITTED:用與運行在提交讀隔離等級的事務相同的鎖語義執行掃描。預設情況下,SQL Server 2000 在此隔離等級上操作。 
READPAST:跳過鎖定行。此選項導致事務跳過由其它事務鎖定的行(這些行平常會顯示在結果集內),而不是阻塞該事務,使其等待其它事務釋放在這些行上的鎖。 READPAST 鎖提示僅適用於運行在提交讀隔離等級的事務,並且只在行級鎖之後讀取。僅適用於 SELECT 語句。 
READUNCOMMITTED:等同於 NOLOCK。 
REPEATABLEREAD:用與運行在可重複讀隔離等級的事務相同的鎖語義執行掃描。 
ROWLOCK:使用行級鎖,而不使用粒度更粗的頁級鎖和表級鎖。 
SERIALIZABLE:用與運行在可串列讀隔離等級的事務相同的鎖語義執行掃描。等同於 HOLDLOCK。 
TABLOCK:使用表鎖代替粒度更細的行級鎖或頁級鎖。在語句結束前,SQL Server 一直持有該鎖。但是,如果同時指定 HOLDLOCK,那麼在事務結束之前,鎖將被一直持有。 
TABLOCKX 使用表的排它鎖。該鎖可以防止其它事務讀取或更新表,並在語句或事務結束前一直持有。 
UPDLOCK:讀取表時使用更新鎖定,而不使用共用鎖定,並將鎖一直保留到語句或事務的結束。UPDLOCK:的優點是允許您讀取資料(不阻塞其它事務)並在以後更新資料,同時確保自從上次讀取資料後資料沒有被更改。 
XLOCK:使用排它鎖並一直保持到由語句處理的所有資料上的事務結束時。可以使用 PAGLOCK 或 TABLOCK 指定該鎖,這種情況下排它鎖適用於適當層級的粒度。

MYSQL select時鎖定記錄問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.