㈠ mysql 表加讀鎖別的sql還能在操作該表嗎
不能操作了, innodb四種級別的鎖, 未提交讀, 已提交讀, 可重復讀 和 可序列化, 不知道你說的是哪個
如果是限制讀, 那就是是最高級別了, 其他操作都不行了.
㈡ 當另外一個進程已經為狀態資料庫加鎖了怎麼解決
資料庫是一個多用戶使用的共享資源。當多個用戶並發地存取數據時,在資料庫中就會產生多個事務同時存取同一數據的情況。若對並發操作不加控制就可能會讀取和存儲不正確的數據,破壞資料庫的一致性。
加鎖是實現資料庫並發控制的一個非常重要的技術。當事務在對某個數據對象進行操作前,先向系統發出請求,對其加鎖。加鎖後事務就對該數據對象有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此數據對象進行更新操作。
在資料庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當數據對象被加上排它鎖時,其他的事務不能對它讀取和修改。加了共享鎖的數據對象可以被其他事務讀取,但不能修改。資料庫利用這兩種基本的鎖類型來對資料庫的事務進行並發控制。
根據保護的對象不同,Oracle資料庫鎖可以分為以下幾大類:
DML鎖(data locks,數據鎖),用於保護數據的完整性;
DDL鎖(dictionary locks,字典鎖),用於保護資料庫對象的結構,如表、索引等的結構定義;
內部鎖和閂(internal locks and latches),保護資料庫的內部結構,應用於SGA;
在我們實際應用開發中涉及較多的是DML鎖,其他兩種的話DBA會更加關心點;
DML鎖的目的在於保證並發情況下的數據完整性,主要包括TM鎖和TX鎖,其中TM鎖稱為表級鎖,TX鎖稱為事務鎖或行級鎖。
當Oracle執行DML語句時,系統自動在所要操作的表上申請TM類型的鎖。當TM鎖獲得後,系統再自動申請TX類型的鎖,並將實際鎖定的數據行的鎖標志位進行置位。這樣在事務加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標志,而只需檢查TM鎖模式的相容性即可,大大提高了系統的效率。TM鎖包括了SS、SX、S、X等多種模式,在資料庫中用0-6來表示。不同的SQL操作產生不同類型的TM鎖。如下圖所示:
值 鎖模式 鎖描述 SQL
0 NONE
1 NULL 空 SELECT
2 SS(ROW-S) 行級共享鎖
其他對象只能查詢這些數據行 SELECT FOR UPDATE、LOCK FOR UPDATE、
LOCK ROW SHARE
3 SX(ROW-X) 行級排它鎖
在提交前不允許做DML操作 INSERT、UPDATE、DELETE、
LOCK ROW SHARE
4 S(SHARE) 共享鎖 CREATE INDEX、LOCK SHARE
5 SSX(S/ROW-X) 共享行級排它鎖 LOCK SHARE ROW EXCLUSIVE
6 X(eXclusive) 排它鎖 ALTER TABLE、DROP TABLE、DROP INDEX、
TRUNCATE TABLE、LOCK EXCLUSIVE
在數據行上只有X鎖(排他鎖)。在 Oracle資料庫中,當一個事務首次發起一個DML語句時就獲得一個TX鎖,該鎖保持到事務被提交或回滾。當兩個或多個會話在表的同一條記錄上執行 DML語句時,第一個會話在該條記錄上加鎖,其他的會話處於等待狀態。當第一個會話提交後,TX鎖被釋放,其他會話才可以加鎖。
在大概了解oracle的鎖機制之後,我們來解決幾個基本的問題:
1.UPDATE/DELETE操作會將RS鎖定,直至操作被COMMIT或者ROLLBACK;
若操作未COMMIT之前其他session對同樣的RS做變更操作,則操作會被hold,直至前session的UPDATE/DELETE操作被COMMIT;
2.session內外SELECT的RS范圍
前提:INSERT、UPDATE操作未COMMIT之前進行SELECT;
若在同一session內,SELECT出來的RS會包括之前INSERT、UPDATE影響的記錄;
若不在同一session內,SELECT出來的RS不會包括未被COMMIT的記錄;
3.SELECT.... FOR UPDATE [OF cols] [NOWAIT/WAIT] [SKIP LOCKED]
OF cols:只鎖定指定欄位所在表的RS,而沒有指定的表則不會鎖定,只會在多表聯合查詢時出現;
NOWAIT:語句不會hold,而是直接返回錯誤ORA-00054: resource busy and acquire with NOWAIT specified;
WAIT N:語句被hold N秒,之後返回錯誤ORA-30006: resource busy; acquire with WAIT timeout expired;
SKIP LOCKED:不提示錯誤,而是直接返回no rows selected;
以上幾個選項可以聯合使用的,比較推薦的有:
SELECT.... FOR UPDATE NOWAIT:對同一RS執行該SQL時,直接返回錯誤;
SELECT.... FOR UPDATE NOWAIT SKIP LOCKED:對同一RS執行該SQL時,直接返回空行;
PS:當RS被LOCK住之後,只對同樣請求LOCK的語句有效,對無需LOCK的SELECT語句並沒有任何影響;
㈢ 「sql」加鎖機制是什麼
您好!鎖是資料庫中的一個非常重要的概念,它主要用於多用戶環境下保證資料庫完整性和一致性。
我們知道,多個用戶能夠同時操縱同一個資料庫中的數據,會發生數據不一致現象。即如果沒有鎖定且多個用戶同時訪問一個資料庫,則當他們的事務同時使用相同的數據時可能會發生問題。這些問題包括:丟失更新、臟讀、不可重復讀和幻覺讀。資料庫加鎖就是為了解決以上的問題。
當然,加鎖固然好,但是一定要避免死鎖的出現。
在資料庫系統中,死鎖是指多個用戶(進程)分別鎖定了一個資源,並又試圖請求鎖定對方已經鎖定的資源,這就產生了一個鎖定請求環,導致多個用戶(進程)都處於等待對方釋放所鎖定資源的狀態。這種死鎖是最典型的死鎖形式, 例如在同一時間內有兩個事務A和B,事務A有兩個操作:鎖定表part和請求訪問表supplier;事務B也有兩個操作:鎖定表supplier和請求訪問表part。結果,事務A和事務B之間發生了死鎖。死鎖的第二種情況是,當在一個資料庫中時,有若干個長時間運行的事務執行並行的操作,當查詢分析器處理一種非常復雜的查詢例如連接查詢時,那麼由於不能控制處理的順序,有可能發生死鎖現象。
在應用程序中就可以採用下面的一些方法來盡量避免死鎖了: (1)合理安排表訪問順序。 (2)在事務中盡量避免用戶干預,盡量使一個事務處理的任務少些, 保持事務簡短並在一個批處理中。 (3)數據訪問時域離散法, 數據訪問時域離散法是指在客戶機/伺服器結構中,採取各種控制手段控制對資料庫或資料庫中的對象訪問時間段。主要通過以下方式實現: 合理安排後台事務的執行時間,採用工作流對後台事務進行統一管理。工作流在管理任務時,一方面限制同一類任務的線程數(往往限制為1個),防止資源過多佔用; 另一方面合理安排不同任務執行時序、時間,盡量避免多個後台任務同時執行,另外, 避免在前台交易高峰時間運行後台任務。 (4)數據存儲空間離散法。數據存儲空間離散法是指採取各種手段,將邏輯上在一個表中的數據分散到若干離散的空間上去,以便改善對表的訪問性能。主要通過以下方法實現: 第一,將大表按行或列分解為若干小表; 第二,按不同的用戶群分解。 (5)使用盡可能低的隔離性級別。隔離性級別是指為保證資料庫數據的完整性和一致性而使多用戶事務隔離的程度,SQL92定義了4種隔離性級別:未提交讀、提交讀、可重復讀和可串列。如果選擇過高的隔離性級別,如可串列,雖然系統可以因實現更好隔離性而更大程度上保證數據的完整性和一致性,但各事務間沖突而死鎖的機會大大增加,大大影響了系統性能。 (6)使用綁定連接, 綁定連接允許兩個或多個事務連接共享事務和鎖,而且任何一個事務連接要申請鎖如同另外一個事務要申請鎖一樣,因此可以允許這些事務共享數據而不會有加鎖的沖突。
總之,了解SQL Server的鎖機制,掌握資料庫鎖定方法, 對一個合格的DBA來說是很重要的。
㈣ SQL insert為什麼加鎖
保證數據一致性,否則2個人一起插一樣的數據,但是這個又不允許數據重復,資料庫就不會處理了
㈤ 兩個SQL的鎖表問題
不是很明白的你的意思,查看是否鎖表的sql:
select s.SID,s.SERIAL#,s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,s.terminal,s.machine,s.program,s.osuser
from v$session s,v$lock l,dba_objects o
where s.sid=l.sid
and o.object_id=l.id1
and s.username is not null ;
如果1 .2是同時操作一張表,最好是執行完一條sql先commit一下在執行第二條這樣肯定不會鎖表,我不知道我理解對了沒有?
ps:不能,資料庫的事務機制不允許同一時刻同一記錄update 如果先update操作會先lock table等執行完釋放資源才有其他的操作。
以下是我做過的測試:
eg:select * from table for update;
1.不允許做for update查詢。
2.允許普通search查詢。
3.不允許對表中任何記錄做update操作;
4.允許insert操作;
5.不允許delete操作。
另:一樓說的是對的。
㈥ sql里的事務語句 默認都有加數據鎖的么
就sqlserver資料庫而言,每一條語句在默認事務級別下(可提交讀級別)都是加鎖的
如一條普通的查詢,要加S鎖(共享),一個更新要加U鎖(更新)等等
你說的表鎖、行鎖只是鎖的粗粒程度,如字面意思,行鎖是鎖住幾行,表鎖就是鎖住整個表所在的全部數據頁
㈦ SQL 存儲過程如何加鎖
create or replace procere testp is
LN number;
jcr_lockhandle varchar2(128);
begin
DBMS_LOCK.allocate_unique('Lock', jcr_lockhandle);--針對當前session加鎖
LOOP
LN := DBMS_LOCK.request ( jcr_lockhandle, TIMEOUT => 0);
IF LN NOT IN (0, 4)--判斷是否被別session鎖住
THEN
DBMS_OUTPUT.put_line ('Already run...');
DBMS_LOCK.sleep (2);--已經被人鎖住,休眠2秒
ELSE
EXIT;--沒有鎖,退出輪詢
END IF;
END LOOP;
dbms_output.put_line('1'); ----你要加鎖的業務邏輯哦
LN := DBMS_LOCK.release ( jcr_lockhandle);--釋放資源
end ;
㈧ sql 怎樣加行鎖
updatetable_namewith(rowlock)setcolumn_name=new_valuewhereyour_condition
㈨ SQL語言中嵌套式是什麼加鎖模式
摘要 如果只是單個的條件的時候,即只有一個連接條件的時候,使用兩種方式都是一樣的,但是,如果是多個條件的話,就要考慮一下效率了,一般這種情況下需要嵌套查詢更能提高效率,因為連接查詢是先要做笛卡爾積之後之後再篩選,而嵌套查詢的話可以先篩選。嵌套查詢也可以理解為子查詢,通常把一個sql的結果集用作另一個sql的一部份都稱為嵌套或者稱這個sql包含有子查詢。
㈩ sql server 加鎖問題
什麼怎麼寫?你這2個事務肯定會死鎖啊,
如果想避免死鎖,就要按順序讀取表,
比如2個事務都先讀取test1,再讀取test2,就可以避免死鎖了
事務2進行如下操作:
begin tran tran2
select * from test1 with(xlock)
waitfor delay '00:00:10'
select * from test2 with(xlock)
commit transaction