天天看點

Select ..for update(nowait)語句在表級别上産生RS鎖,在資料行上産生行級鎖(是一種X鎖)

一、悲觀封鎖

鎖在使用者修改之前就發揮作用:

Select ..for update(nowait)

Select * from tab1 for update

使用者發出這條指令之後,oracle将會對傳回集中的資料建立行級封鎖,以防止其他使用者的修改。

如果此時其他使用者對上面傳回結果集的資料進行dml或ddl操作都會傳回一個錯誤資訊或發生阻塞。

1:對傳回結果集進行update或delete操作會發生阻塞。

2:對該表進行ddl操作将會報:Ora-00054:resource busy and acquire with nowait specified.

原因分析

此時Oracle已經對傳回的結果集上加了排它的行級鎖,所有其他對這些資料進行的修改或删除操作都必須等待這個鎖的釋放,産生的外在現象就是其他的操作将發生阻塞,這個這個操作commit或rollback.

同樣這個查詢的事務将會對該表加(DML操作的)表級鎖,不允許對該表的任何ddl操作,否則将會報出ora-00054錯誤::resource busy and acquire with nowait specified.

附加:表級鎖是用于防止表的結構的修改。

繼續閱讀