SQL死锁查询及处理,死锁知识了解
--SQL Server 查看死锁进程
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
--杀死死锁进程
kill 59
--显示死锁相关信息
exec sp_who2 59
所有死锁的原因可归结为资源的竞争
一个用户A 访问表A(锁住了表A),然后又访问表B 另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了 同样用户B要等用户A释放表A才能继续这就死锁了
解决方法: 这种死锁是由于你的程序的'bug'产生的,除了调整你的程序的逻辑别无他法,仔细分析你程序的逻辑, 1:尽量避免同时锁定两个资源 2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源.
表现二:
用户A读一条纪录,然后修改该条纪录,这是用户B修改该条纪录这里用户A的事务里锁的性质由共享锁企图上升到独占锁(forupdate),而用户B里的独占锁由于A有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁
--解决方法: 让用户A的事务(即先读后写类型的操作),
--在select 时就是用Update lock 语法如下:
select * from table1 (updlock) where ....
NOLOCK
NOLOCK在概念上类似于READ UNCOMMITTED隔离级别,并且只针对于SELECT查询语句,它不会获取表的共享锁,换句话说不会阻止排它锁来更新数据行。当我们对表进行NOLOCK有什么好处呢?它能够提高并发性能,因为此时SQL Server数据库引擎不必去维护共享锁,由于不会对正在读取的表获取共享锁,所以可能导致未提交的事务也会被读取,所以此时缺点显而易见将导致脏读
SELECT COUNT(*) FROM Example WITH(NOLOCK)
READPAST
当在表中用READPAST指定提示时此时SQL Server数据库引擎在返回结果集时将不会返回锁定的行或者数据页。它除了和NOLOCK一样不会导致查询阻塞外,因为不会返回锁定的行记录所以其优点好包括不存在脏读。但是其缺点则是因为不包含锁定的行记录但是很难保证结果集或者修改语句是否包含我们所必须需要返回的行。有可能在我们的业务逻辑中,需要返回我们必须需要的行。它的使用方式和NOLOCK一样
SELECT COUNT(*)FROM Example WITH(READPAST)
UPDLOCK
UPDLOCK只是针对于表中的某一行记录来锁定从而阻止其他操作对该行的数据更新,说到这里想必我们已经明了,UPDLOCK是行级别,而排它锁则是表级别,二者不可同日而语。也就说当我们对某一行添加UPDLOCK提示时并不会阻塞其他查询操作
BEGIN TRAN
select * from Example WITH (UPDLOCK) where SaleID = 1
--此时我们再来开一个窗口进行查询,如下:
select * from Example
使用HOLDLOCK提示时,此时查询将锁定表且被强制序列化,直到事务完成,才会被释放,其类似于SERIALIZABLE最高隔离级别
BEGIN TRAN
select * from Example WITH (UPDLOCK,HOLDLOCK) where SaleID = 1
相关文章
- 查看Mysql实时执行的Sql语句
- SQL Server R2 2008中的SQL Server Management Studio 阻止保存要求重新创建表的更改问题的设置方法
- 【PL/SQL】游标提取循环
- Sql Server之旅——第十二站 sqltext的参数化处理
- 【MySql】复制出现Slave_SQL_Running: No 错误解决
- SQL Server账号密码(sa)登录失败 错误原因:18456
- sql中的笛卡尔积
- C#操作SQL Server中的Image类型数据
- .NET和SQL Server中“空值”辨析 (DBNull与Null的区别)
- 手把手教你-----巧用Excel批量生成SQL语句,处理大量数据
- PL/SQL异常处理(原创)
- SQL Server 2008连接字符串写法大全{转}
- [SQL] sql server中如何查看执行效率不高的语句
- SQL SERVER服务器链接连接(即sql server的跨库连接)
- 64位win7下PL/SQL Developer 报“ORA-12154: TNS:无法解析指定的连接标识符”问题的一个解决办法
- Sql Server中sql语句自动换行
- SQL SERVER服务器链接连接(即sql server的跨库连接)
- Sql Server中sql语句自动换行
- Atitit 读取数据库的api orm SQL Builder sql对比 目录 1.1. 提高生产效率的 ORM 和 SQL Builder1 1.2. SQL Builder 在 SQL
- Atitit 补充说明 sql知识图谱与线路图attilax总结补充说明
- mybatis SQL性能调优
- Sql:成功解决将sql输出的datetime时间格式转为常规格式
- 【sql优化】(大表小技巧)有时候 2 小时的 SQL 操作,可能只要 1 分钟
- sql substr切割字符串
- sql语句中BEGIN TRAN...COMMIT TRAN
- SQL——Sql_Server中如何判断表中某字段、判断表、判断存储过程以及判断函数是否存在
- 灵活好用的sql monitoring 脚本 part4
- sql的介绍——SQL Server数据库管理系统