这个是我很久很久以前的存稿。。。。。
今天在使用SQLServer2008时,出现了一个大问题:
数据库表被锁住了,查看被锁住的进程时,发现有很多。
查看数据库进程的sql语句:
select request_session_id spid,
OBJECT_NAME(resource_associated_entity_id)
tableName from sys.dm_tran_locks where resource_type='OBJECT';
然后作死的杀死了所有进程:
declare @spid int
Set @spid = 62 --锁表进程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)
杀死进程后,发现数天没关的电脑上的数据库的数据居然回退到几天前的数据了!让我生无可恋。不知道为何会出现这种情况,因此问了很多大牛,终于搞清楚了!
原来,我在执行的时候,由于数据库表设计的不合理,导致了很多进程没有提交,还有就是对表格的操作的过程中也产生了很多表格的操作顺序发生冲突,把表给锁住了,导致进程未被提交,没有及时提交。因此我们把进程杀死的时候,会把所有的事物全部都rollback,再加上很久没关电脑,就造成了前面的窘境。
在执行杀死进程操作时,我们可以看看还有没有未被提交的进程和事物。
SELECT @@TRANCOUNT--返回当前连接的活动事务数。