一个表被锁,不能使用了,两种可能:查询时,自动对其进行"表锁"了; 查询时,语句过于复杂,花费的时间过长。
查询方式:
1. 使用SQL Server Profiler查看消耗时间;
SQL Server使用工具查看资源消耗: 打开SQL Server--【工具】-【SQL Server Profiler】
2. 查询在调用"存过"时,通过ID找到被锁的表。
查询死锁表的语句:
select
spid 进程,
status 状态,
登录帐号=SUBSTRING(SUSER_SNAME(sid),1,30),
用户机器名称=SUBSTRING(hostname,1,12),
是否被锁住=convert(char(3),blocked),
数据库名称=SUBSTRING(db_name(dbid),1,20),
cmd 命令,
waittype as 等待类型,
last_batch 最后批处理时间,
open_tran未提交事务的数量
from master.sys.sysprocessesorder by spid desc
解决办法:
1. 对此表查询时,进行行锁(RowLock);
2.优化查询语句,减少非ID,非索引的列的使用。
存储过程调用时使用的锁:
with(HOLDLOCK) //共享锁,直到事物结束才释放
with(TABLOCKX) //表锁,查询此表时,锁表
with(ROWLOCK) //行锁,查询此行信息时,锁行
查询方式:
1. 使用SQL Server Profiler查看消耗时间;
SQL Server使用工具查看资源消耗: 打开SQL Server--【工具】-【SQL Server Profiler】
2. 查询在调用"存过"时,通过ID找到被锁的表。
查询死锁表的语句:
select
spid 进程,
status 状态,
登录帐号=SUBSTRING(SUSER_SNAME(sid),1,30),
用户机器名称=SUBSTRING(hostname,1,12),
是否被锁住=convert(char(3),blocked),
数据库名称=SUBSTRING(db_name(dbid),1,20),
cmd 命令,
waittype as 等待类型,
last_batch 最后批处理时间,
open_tran未提交事务的数量
from master.sys.sysprocessesorder by spid desc
解决办法:
1. 对此表查询时,进行行锁(RowLock);
2.优化查询语句,减少非ID,非索引的列的使用。
存储过程调用时使用的锁:
with(HOLDLOCK) //共享锁,直到事物结束才释放
with(TABLOCKX) //表锁,查询此表时,锁表
with(ROWLOCK) //行锁,查询此行信息时,锁行
select * from table With(ROWLOCK)where Id=@id