鎖表 儲存過程 游標

2021-06-07 03:22:41 字數 2776 閱讀 8830

可以用select來鎖定整張表,那別人就不可能更新或是讀取表的記錄。

select * from dbo.employee with(holdlock); with關鍵字來設定鎖表的方式。下面是with括號內關鍵字的書名: 

nolock(不加鎖)

此選項被選中時,sql server 在讀取或修改資料時不加任何鎖。 在這種情況下,使用者有可能讀取到未完成事務(uncommited transaction)或回滾(roll back)

中的資料, 即所謂的「髒資料」。

holdlock(保持鎖)

此選項被選中時,sql server 會將此共享鎖保持至整個事務結束,而不會在途中釋放。

updlock(修改鎖)

此選項被選中時,sql server 在讀取資料時使用修改鎖來代替共享鎖,並將此鎖保持至整個事務或命令結束。使用此選項能夠保證多個程序能同時讀取數

據但只有該程序能修改資料。

tablock(表鎖)

此選項被選中時,sql server 將在整個表上置共享鎖直至該命令結束。 這個選項保證其他程序只能讀取而不能修改資料。

paglock(頁鎖)

此選項為預設選項, 當被選中時,sql server 使用共享頁鎖。

tablockx(排它表鎖)

此選項被選中時,sql server 將在整個表上置排它鎖直至該命令或事務結束。這將防止其他程序讀取或修改表中的資料。

holdlock 持有共享鎖,直到整個事務完成,應該在被鎖物件不需要時立即釋放,等於serializable事務隔離級別

nolock 語句執行時不發出共享鎖,允許髒讀 ,等於 read uncommitted事務隔離級別

paglock 在使用乙個表鎖的地方用多個頁鎖

readpast 讓sql server跳過任何鎖定行,執行事務,適用於read uncommitted事務隔離級別只跳過rid鎖,不跳過頁,區域和表鎖

rowlock 強制使用行鎖

tablockx 強制使用獨佔表級鎖,這個鎖在事務期間阻止任何其他事務使用這個表

uplock 強制在讀表時使用更新而不用共享鎖 。

呵呵,上面的夠研究一會的了,我常用的就是holdlock和tablockx,holdlock是鎖定一張表,但是別的事物還是可以讀取的,但不能更新和插入。對於

tabllockx,在事物未提交前,連讀取都是阻塞的,直到另一事物提交後才可以讀取,這樣就保證了資料的一致性。不過鎖表需要包含在事物內,否則鎖表

-->create procedure pk_test as

//宣告2個變數 declare @o_id nvarchar(20) declare @a_salary float

//宣告乙個游標mycursor,select語句中引數的個數必須要和從游標取出的變數名相同

declare mycursor cursor for select o_id,a_salary from addsalary

//開啟游標 open mycursor

//從游標裡取出資料賦值到我們剛才宣告的2個變數中 fetch next from mycursor into @o_id,@a_salary

//判斷游標的狀態

//0 fetch語句成功

//-1 fetch語句失敗或此行不在結果集中

//-2被提取的行不存在

while (@@fetch_status=0)

begin //顯示出我們每次用游標取出的值 print '游標成功取出一條資料'

print @o_id print @a_salary

//用游標去取下一條記錄

fetch next from mycursor into @o_id,@a_salary end

//關閉游標 close mycursor //撤銷游標 deallocate mycursor go

-------------------建立游標

declare mycursor cursor for select meterid,locationid from [ucms].[dbo].[t_meterinfo]

open mycursor

fetch next from mycursor

declare @meterid int,@locationid int

fetch next from mycursor into @meterid,@locationid

print @meterid

print @locationid

close mycursor

deallocate mycursor

go-----------------儲存過程

create procedure pk_salaryadd

asdeclare @o_id nvarchar(20),@a_salary float

declare mycursor cursor for select o_id,a_salary from addsalary

open mycursor

fetch next from mycursor into @o_id,@a_salary

while(@@fetch_status = 0)

begin update originsalary set o_salary=o_salary+@a_salary where o_id=@o_id fetch next from mycursor into @o_id,@a_salary end close mycursor deallocate mycursor

go

儲存過程,游標,迴圈,臨時表

create procedure hr attabn qry2 d date nvarchar 10 null,deptno nvarchar 1000 null as begin declare sql nvarchar 1000 建立臨時表 create table mytemptable de...

sql儲存過程 游標 迴圈表

游標例項 利用游標迴圈表 根據userid賦值 alter procedure cursor eg1 asbegin declare a int,error int declare temp varchar 50 臨時變數,用來儲存游標值 set a 1 set error 0 begin tran...

oracle儲存過程,游標

oracle儲存過程,游標 2010 07 07 13 01 create or replace procedure p tb task log is 功能 插入任務到任務日誌表 v task start date date v task end date date v sql code numbe...