當前位置:首頁 » 編程語言 » sqlservernolock

sqlservernolock

發布時間: 2023-03-22 07:09:37

sqlserver nolock plsql中有嗎

一般用於含棚信此類語談輪句中:select * from t with(NOLOCK)
nolock是不加鎖查詢,可以讀取被事務鎖定的數據,也稱為臟讀。
說明:
使當前會話的查詢,不受其它會話的事務所阻塞。
但是這樣做,就讀取了其它事務的「修改後未提交的」數據。
也就是允許「READ UNCOMMITTED」!和改

⑵ 如何解除sql server資料庫數據被鎖定

(1)
HOLDLOCK:
在該表上保持共享鎖,直到整個事務結束,而不是在語句執行完立即釋放所添加的鎖。
(2)
NOLOCK:不添加共享鎖和排它鎖,當這個選項生效後,可能讀到未提交讀的數據或「臟數據」,這個選項僅僅應用於SELECT語句。
(3)
PAGLOCK:指定添加頁鎖(否則通常可能添加表鎖)。
(4)
READCOMMITTED用與運行在提交讀隔離級別的事務相同的鎖語義執行掃描。默認情況下,SQL
Server
2000
在此隔離級別上操作。
(5)
READPAST:
跳過已經加鎖的數據行,這個選項將使事務讀取數據時跳過那些已經被其他事務鎖定的數據行,而不是阻塞直到其他事務釋放鎖,
READPAST僅僅應用於READ
COMMITTED隔離性級別下事務操作中的SELECT語句操作。
(6)
READUNCOMMITTED:等同於NOLOCK。
(7)
REPEATABLEREAD:設置事務為可重復讀隔離性級別。
(8)
ROWLOCK:使用行級鎖,而不使用粒度更粗的頁級鎖和表級鎖。
(9)
SERIALIZABLE:用與運行在可串列讀隔離級別的事務相同的鎖語義執行掃描。等同於
HOLDLOCK。
(10)
TABLOCK:指定使用表級鎖,而不是使用行級或頁面級的鎖,SQL
Server在該語句執行完後釋放這個鎖,而如果同時指定了...(1)
HOLDLOCK:
在該表上保持共享鎖,直到整個事務結束,而不是在語句執行完立即釋放所添加的鎖。
(2)
NOLOCK:不添加共享鎖和排它鎖,當這個選項生效後,可能讀到未提交讀的數據或「臟數據」,這個選項僅僅應用於SELECT語句。
(3)
PAGLOCK:指定添加頁鎖(否則通常可能添加表鎖)。
(4)
READCOMMITTED用與運行在提交讀隔離級別的事務相同的鎖語義執行掃描。默認情況下,SQL
Server
2000
在此隔離級別上操作。
(5)
READPAST:
跳過已經加鎖的數據行,這個選項將使事務讀取數據時跳過那些已經被其他事務鎖定的數據行,而不是阻塞直到其他事務釋放鎖,
READPAST僅僅應用於READ
COMMITTED隔離性級別下事務操作中的SELECT語句操作。
(6)
READUNCOMMITTED:等同於NOLOCK。
(7)
REPEATABLEREAD:設置事務為可重復讀隔離性級別。
(8)
ROWLOCK:使用行級鎖,而不使用粒度更粗的頁級鎖和表級鎖。
(9)
SERIALIZABLE:用與運行在可串列讀隔離級別的事務相同的鎖語義執行掃描。等同於
HOLDLOCK。
(10)
TABLOCK:指定使用表級鎖,而不是使用行級或頁面級的鎖,SQL
Server在該語句執行完後釋放這個鎖,而如果同時指定了HOLDLOCK,該鎖一直保持到這個事務結束。
(11)
TABLOCKX:指定在表上使用排它鎖,這個鎖可以阻止其他事務讀或更新這個表的數據,直到這個語句或整個事務結束。
(12)
UPDLOCK
:指定在
讀表中數據時設置更新
鎖(update
lock)而不是設置共享鎖,該鎖一直保持到這個語句或整個事務結束,使用UPDLOCK的作用是允許用戶先讀取數據(而且不阻塞其他用戶讀數據),並且保證在後來再更新數據時,這一段時間內這些數據沒有被其他用戶修改。

⑶ sqlserver 支持定位當前頁,自定義排序的分頁SQL(拒絕動態SQL)

1,場景:根據學生編號查詢,返回該學生所在班級的所有學生。支持分頁、自定義排序及結果集自動定位到查詢條件的學生編號所在頁。
復制代碼
代碼如下:
CREATE
PROC
[dbo].[Sp_testpagerandsorting]
(@GroupID
INT,
@CurrentId
INT,
@TimeFrom
DATETIME,
@TimeTo
DATETIME,
@OrderBy
CHAR(50),
@PageSize
INT,
@CurrentPage
INT)
AS
SET
nocount
ON
BEGIN
DECLARE
@StartNumber
INT,
@EndNumber
INT,
@CurrentIdRowNumber
INT,
@RecordCount
INT,
@EndPageIndex
INT
DECLARE
@RowNumberTable
TABLE
(
rownumber
INT
IDENTITY
(1,
1),
id
INT
)
--step
1:
Build
sort
id
list
-------------------------------------------------------
INSERT
INTO
@RowNumberTable
(id)
SELECT
sm.id
AS
id
FROM
dbo.test
sm
WITH
(nolock)
WHERE
indate
BETWEEN
Coalesce(@TimeFrom,
indate)
AND
Coalesce(@TimeTo,
indate)
AND
sm.groupid
=
@GroupID
ORDER
BY
CASE
WHEN
@OrderBy
=
'InDate
desc'
THEN
(
Row_number()
OVER
(ORDER
BY
indate
DESC))
WHEN
@OrderBy
=
'InDate
asc'
THEN
(Row_number()
OVER
(ORDER
BY
indate
ASC))
WHEN
@OrderBy
=
'Id
asc'
THEN
(Row_number()
OVER
(ORDER
BY
sm.id
ASC))
WHEN
@OrderBy
=
'Id
desc'
THEN
(Row_number()
OVER
(ORDER
BY
sm.id
DESC))
WHEN
@OrderBy
=
'Name
asc'
THEN
(Row_number()
OVER
(ORDER
BY
sm.name
ASC))
WHEN
@OrderBy
=
'Name
desc'
THEN
(Row_number()
OVER
(ORDER
BY
sm.name
DESC)
)
END
--step
2:
Reset
page
index
with
current
id
-----------------------------------------
IF
@CurrentIdNumber
>
0
BEGIN
SELECT
TOP
1
@CurrentIdRowNumber
=
rownumber
FROM
@RowNumberTable
WHERE
id
=
@CurrentIdNumber
IF
@CurrentIdRowNumber
>
0
BEGIN
IF
@CurrentPage
=
0
BEGIN
SET
@CurrentPage
=
Ceiling(CAST(@CurrentIdRowNumber
AS
DECIMAL)
/
CAST
(@PageSize
AS
DECIMAL))
END
END
END
ELSE
BEGIN
IF
@CurrentPage
=
0
BEGIN
SET
@CurrentPage
=
1
END
END
--step
3:
Set
recordCount
-----------------------------------------
SELECT
@RecordCount
=
COUNT(1)
FROM
@RowNumberTable
--step
4:
Calc
startNumber
&
endNumber
-----------------------------------------
SELECT
@StartNumber
=
@PageSize
*
(
@CurrentPage
-
1
),
@EndNumber
=
@PageSize
*
(
@CurrentPage
-
1
)
+
@pageSize,
@EndPageIndex
=
Ceiling(CAST(@RecordCount
AS
DECIMAL)
/
CAST(@PageSize
AS
DECIMAL))
IF
@CurrentPage
=
@EndPageIndex
BEGIN
SET
@EndNumber
=
@RecordCount
END
--step
5:
Get
sorted
id
of
current
page
-----------------------------------------
;WITH
a
AS
(SELECT
TOP
(@EndNumber
-
@StartNumber)
id,
rownumber
FROM
(SELECT
TOP
(@EndNumber)
id,
rownumber
FROM
@RowNumberTable)
AS
b
ORDER
BY
rownumber
DESC)
--step
6:
Return
current
page
idList
-------------------------------------------------------
SELECT
[ID],
[GroupID]
[Name],
[Address]
FROM
dbo.test
sm
WITH(nolock)
INNER
JOIN
a
ON
a.id
=
sm.id
ORDER
BY
a.rownumber
--
step
7:return
current
page
&
record
count
----------------------------------
SELECT
@CurrentPage
AS
currentpage,
@RecordCount
AS
recordcount
END
2,簡單條件的,動態where語句(關於Like查詢的動態where,建議使用笨辦法做)
復制代碼
代碼如下:
CREATE
PROC
[dbo].[Getstudentlistbycondition]
@Name
NVARCHAR(20),
@Class
INT
AS
SET
nocount
ON
BEGIN
BEGIN
SELECT
[Name],
[class]
FROM
[testtable]
WHERE
[Class]
=
CASE
WHEN
@Class
>
0
THEN
@Class
ELSE
[Class]
END
AND
[name]
=
CASE
WHEN
@Name
<>
''
THEN
@Name
ELSE
[Name]
END
END
END

⑷ sqlserver 存儲過程事務回滾怎麼寫

begin tran
。。。。。。
在存儲過程後面加上:
if @@error<>0
rollback tran
else
commit tran

⑸ SQL Server 中的 NOLOCK 到底是什麼意思

nolock是不加鎖查詢。能夠讀取被事務鎖定的數據,也稱為臟讀。

一般用於此類語句中:select * from t with(NOLOCK)

不發布共享鎖來阻止其他事務修改當前事務讀取的數據,其他事務設置的排他鎖不會阻礙當前事務讀取鎖定數拍攜據。漏銷允許臟讀可能產生較多的並發操作,但其代價是讀取以後會被其他事務回滾的數據修改。這可能會使您的事務出錯,向用戶顯示從未提交過的數據,或者導致用戶兩次看到記錄(或根本看不到記錄)。



使用場景

綜合考慮性能情況與業務要求來決定是否使用WITH(NOLOCK),例如涉及到金融或會計成本之類的系統,出現臟讀那是要產生嚴重問題的。大體來說一般有下面一些場景可以使用WITH(NOLOCK)

1、基礎數據表,這些表的數據很少變更。

2、歷史數據表,這些表的數據很少變更。

3、業務襲搜伏允許臟讀情況出現涉及的表。

4、數據量超大的表,出於性能考慮,而允許臟讀。

另外一點就是不要濫用WITH(NOLOCK)。

⑹ 關於sqlserver存儲過程事務鎖的問題

就你上面的事例而言,select的共享鎖性質是得到結果即釋放,不會在事務中保留
而update所用到的U鎖及其進一步的X鎖則需要持續到事務的結束
如果是多線程的程序的話,在select與update處都可能會出現鎖等待,這要根據實際操作中數據是否沖突來看

⑺ SQLServer死鎖的解除方法

SQL Server死鎖使我們經差鍵常遇到的問題 下面就為您介紹如何查詢SQL Server死喊慶晌鎖 希望對您學習SQL Server死鎖方面能有所幫鄭鋒助

SQL Server死鎖的查詢方法

exec master dbo p_lockinfo 顯示死鎖的進程 不顯示正常的進程

exec master dbo p_lockinfo 殺死死鎖的進程 不顯示正常的進程

SQL Server死鎖的解除方法

Create proc p_lockinfo

@kill_lock_spid bit= 是否殺掉死鎖的進程 殺掉 僅顯示

@show_spid_if_nolock bit= 如果沒有死鎖的進程 是否顯示正常進程信息 顯示 不顯示

as

declare @count int @s nvarchar( ) @i int

select id=identity(int ) 標志

進程ID=spid 線程ID=kpid 塊進程ID=blocked 資料庫ID=dbid

資料庫名=db_name(dbid) 用戶ID=uid 用戶名=loginame 累計CPU時間=cpu

登陸時間=login_time 打開事務數=open_tran 進程狀態=status

工作站名=hostname 應用程序名=program_name 工作站進程ID=hostprocess

域名=nt_domain 網卡地址=net_address

into #t from(

select 標志= 死鎖的進程

spid kpid a blocked dbid uid loginame cpu login_time open_tran

status hostname program_name hostprocess nt_domain net_address

s =a spid s =

from mastersysprocesses a join (

select blocked from mastersysprocesses group by blocked

)b on a spid=b blocked where a blocked=

union all

select |_犧牲品_>

spid kpid blocked dbid uid loginame cpu login_time open_tran

status hostname program_name hostprocess nt_domain net_address

s =blocked s =

from mastersysprocesses a where blocked<>

)a order by s s

select @count=@@rowcount @i=

if @count= and @show_spid_if_nolock=

begin

insert #t

select 標志= 正常的進程

spid kpid blocked dbid db_name(dbid) uid loginame cpu login_time

open_tran status hostname program_name hostprocess nt_domain net_address

from mastersysprocesses

set @count=@@rowcount

end

if @count>

begin

create table #t (id int identity( ) a nvarchar( ) b Int EventInfo nvarchar( ))

if @kill_lock_spid=

begin

declare @spid varchar( ) @標志 varchar( )

while @i<=@count

begin

select @spid=進程ID @標志=標志 from #t whereid=@i

insert #t exec( dbcc inputbuffer( +@spid+ ) )

if @標志= 死鎖的進程 exec( kill +@spid)

set @i=@i+

end

end

else

while @i<=@count

begin

select @s= dbcc inputbuffer( +cast(進程ID as varchar)+ ) from #t whereid=@i

insert #t exec(@s)

set @i=@i+

end

select a * 進程的SQL語句=b EventInfo

from #t a join #t b on a id=b id

lishixin/Article/program/SQLServer/201311/22183

⑻ sqlserver怎麼清除死鎖

1、首先需要判斷是哪個用戶鎖住了哪張表.

查詢被鎖表

selectrequest_session_idspid,OBJECT_NAME(resource_associated_entity_id)tableName
fromsys.dm_tran_lockswhereresource_type='OBJECT'

查詢後會返回一個包含spid和tableName列的表.

其中spid是進程名,tableName是表名.

2.了解到了究竟是哪個進程鎖了哪張表後,需要通過進程找到鎖表的主機.

查詢主機名

execsp_who2'xxx'

xxx就是spid列的進程,檢索後會列出很多信息,其中就包含主機名.

3.通過spid列的值進行關閉進程.

關閉進程

declare@spidint
Set@spid=xxx--鎖表進程
declare@sqlvarchar(1000)
set@sql='kill'+cast(@spidasvarchar)
exec(@sql)

PS:有些時候強行殺掉進程是比較危險的,所以最好可以找到執行進程的主機,在該機器上關閉進程.

熱點內容
可以上傳球球的照片 發布:2024-11-05 15:42:59 瀏覽:738
拉箱怎麼改密碼 發布:2024-11-05 15:38:02 瀏覽:862
http怎麼配置 發布:2024-11-05 15:02:45 瀏覽:461
12級緩存 發布:2024-11-05 14:52:09 瀏覽:578
神武4腳本 發布:2024-11-05 14:48:50 瀏覽:702
王者榮耀反復解壓 發布:2024-11-05 14:31:58 瀏覽:853
存儲引擎有哪些品牌 發布:2024-11-05 14:25:59 瀏覽:39
紅薯的存儲方法 發布:2024-11-05 14:17:32 瀏覽:757
腳本錯誤彈窗口在哪裡 發布:2024-11-05 14:01:16 瀏覽:967
java微信demo 發布:2024-11-05 13:50:31 瀏覽:238