sqlserver进程死锁的解决办法(一)
2015-11-22 14:57
441 查看
之前查了很多资料,一般都是在select 语句添加with(nolock)即可,但是如果是调用一些源码jar包,可是包里面的方法没有添加with(nolock),那么久没有办法了,例如之前我做工工作流,调用的是activiti的jar包,它对于ibatis的调用,默认是不加with(nolock)的,所以,当两个以上系统,同时操作一个库的时候,就会发生死锁现象,因为查找的字段没有添加索引,查找的时候不加with(nolock)的是全表,所以,还有一种办法可以解决,就是
给查找的字段添加索引,通过索引查找,锁的是行。
没索引的,就是扫描全表了
当对有影响的属性都添加索引后,那么执行sql操作的时候锁的就是行了,这样只要不是操作同一行数据,就不会发生死锁了。类似我遇到的问题,虽然是两个系统操作同一个数据库,但是不会操作同一行数据,所以就不会发生死锁现象。
总结:
死锁的发生,主要是两个进程分别对一些资源加了锁,同时又请求对方枷锁的资源造成的现象,目前就我的知识来说,解决的办法,找到下面介个:
(1)理清思路,尽量不要有几个系统同时使用一个数据库,这样很难设置事物的隔离级别,并且把控数据库SQL的执行顺序。
(2)select操作,一定要添加with(nolock);
(3)在可能发生死锁的资源上添加索引,这样就不会发生锁全表的情况。添加的是行锁。
给查找的字段添加索引,通过索引查找,锁的是行。
没索引的,就是扫描全表了
当对有影响的属性都添加索引后,那么执行sql操作的时候锁的就是行了,这样只要不是操作同一行数据,就不会发生死锁了。类似我遇到的问题,虽然是两个系统操作同一个数据库,但是不会操作同一行数据,所以就不会发生死锁现象。
总结:
死锁的发生,主要是两个进程分别对一些资源加了锁,同时又请求对方枷锁的资源造成的现象,目前就我的知识来说,解决的办法,找到下面介个:
(1)理清思路,尽量不要有几个系统同时使用一个数据库,这样很难设置事物的隔离级别,并且把控数据库SQL的执行顺序。
(2)select操作,一定要添加with(nolock);
(3)在可能发生死锁的资源上添加索引,这样就不会发生锁全表的情况。添加的是行锁。
相关文章推荐
- MySQL的复制和临时表Temporary Table
- MySQL源代码:从SQL语句到MySQL内部对象
- “ORA-01110: data file 1: 'F:\oracle\product\10.2.0\oradata\orcl\sysaux01.dbf'"解决方法
- gdb -Mysql源代码级调试方法
- mysql---级联更新和删除操作
- MySQL 表操作
- c# 进度条BackgroundWorker 组件用来执行诸如数据库事务、文件下载等耗时的异步操作
- BackgroundWorker 组件用来执行诸如数据库事务、文件下载等耗时的异步操作
- MySQL 数据修改
- MySQL 库操作
- SQL Server 中 Index Allocation Map(IAM)介绍 01
- MySQL 数据查询
- C#使用ODAC向Oracle数据库插入海量实时数据
- Sql Group by 使用
- Sql Server中的DBCC命令详细介绍
- ubuntu14.04完全卸载mysql
- Ubuntu14.04下MySQL的安装
- windows下mysql提示Can't connect to MySQL server on 'localhost'
- mybatis和ibatis控制台打印sql语句方法
- gdb mysql stack get