及时commit或rollback就不会死锁,顶多是更新不成功而已
解决方案 »
- 请问各位,我的SQL2005企业版为什么没有导入导出这个功能,如何设置?
- 根据‘字段’ 查询 该‘存储过程’的名称
- 修改表 int字段 +1
- 求一SQL语句!
- 求一个sql语句,横向数据纵向显示
- SQL ODBC 查询
- 为什么我写的程序换一台电脑就不能用了
- SQL2000能否导入大量的XML文档
- VFP中,怎么把字符串转化成关键字.就是把'abcd'去掉引号看成abcd.让程序执行
- send email from SQL Server database (multiple recipients)
- 请教一个存储过程问题
- 怎么样取我设定时间间隔的数据出来?(急急!!!!!!!!!!!!!!!!!)
"只有一个事务能够资源的独占锁"
事务一先-->取得独占锁-->更新A,再-->取得独占锁(冲突,正被事务二锁,更新无法进行)-->更新B,再SUBMIT (释放两个资源的独占锁)
事务二先-->取得独占锁-->更新B,再-->取得独占锁(冲突,正被事务一锁,更新无法进行)-->新A,再SUBMIT(释放两个资源的独占锁)
如果两个事务正如楼主假设所说的,不要造成死锁吗?
如何能避免这种情况呢?
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c31)排它鎖
新建兩個連接
在第一個連接中執行以下語句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran
在第二個連接中執行以下語句
begin tran
select * from table1
where B='b2'
commit tran若同時執行上述兩個語句,則select查詢必須等待update執行完畢才能執行即要等待30秒2)共用鎖
在第一個連接中執行以下語句
begin tran
select * from table1 holdlock -holdlock人為加鎖
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran在第二個連接中執行以下語句
begin tran
select A,C from table1
where B='b2'
update table1
set A='aa'
where B='b2'
commit tran若同時執行上述兩個語句,則第二個連接中的select查詢可以執行
而update必須等待第一個連接中的共用鎖結束後才能執行 即要等待30秒3)鎖死
增設table2(D,E)
D E
d1 e1
d2 e2
在第一個連接中執行以下語句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30'
update table2
set D='d5'
where E='e1'
commit tran在第二個連接中執行以下語句
begin tran
update table2
set D='d5'
where E='e1'
waitfor delay '00:00:10'
update table1
set A='aa'
where B='b2'
commit tran同時執行,系統會檢測出鎖死,並中止進程如果是鎖死可以查一下:
1:sp_who 或 sp_who2
2: Select * from sysprocesses where blocked <> 0
3: 企業管理器->伺服器->管理工具->活動->當前活動 然後把他kill掉
4:SQL事件探查器,監控一下,看主要是那些處理引起的鎖死.然後做相應的處理.
用事件探查器new一個trace,監視一下造成你sqlserver停頓的情況最好的辦法還是檢查一下引起鎖的原因,一般是有你的代碼引起的。
select * from aaa with(nolock) 也許可以解決一點問題。
nolock:不要發出共用鎖,並且不要提供排它鎖。當此選項生效時,可能會讀取未提交的事務或一組在讀取中間回滾的頁面。有可能發生髒讀。僅應用於 SELECT 語句。