sqlservernolock
⑴ 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:有些时候强行杀掉进程是比较危险的,所以最好可以找到执行进程的主机,在该机器上关闭进程.