返回信息流这句是用排他锁锁定where指定的行吗?
这是一条镜像帖。来源:北邮人论坛 / database / #499同步于 2006/12/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖
关于数据库锁定select * from ***** with (xlock) where~~~~
Adun
2006/12/15镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
我自己建了个工程测试一下。一个Form1,上面两个按钮command1和command2
Private Sub Command1_Click()
On Error GoTo err:
strsql = "select * from roomstate with (xlock) where roomno='101'"
cn.Execute (strsql)
MsgBox "ok"
Exit Sub
err:
MsgBox err.Number & err.Description
End Sub
Private Sub Command2_Click()
On Error GoTo err:
strsql = "select * from roomstate with (xlock) where roomno='102'"
cn.Execute (strsql)
MsgBox "ok"
Exit Sub
err:
MsgBox err.Number & err.Description
End Sub
Private Sub Form_Load()
Call Con
cn.BeginTrans
End Sub
Private Sub Form_Unload(Cancel As Integer)
cn.CommitTrans
End Sub
生成exe。然后同时打开两个。点击第一个窗口的command1后,再点击第二个窗口的command2,就报超时错。。。难道这个语句能把这个表都锁上?
并不只锁定where指定的行,而是锁定了所有为了完成此条查询而扫描过的行。
可以肯定LZ的roomstate表中roomno行上没有加索引,因此为了完成针对roomno的where条件,DBMS必须使用顺序扫描(sequencial scan)的方法进行查询。别看最终的结果是只有一行,实际上DBMS扫描过的却是表中的全部行,也就是对所有行都加了排它锁。这就是楼主实验的解释。
楼主可以对表中的roomno建一个索引,就不会出现以上问题了。这是因为,这时DBMS只要使用索引就可以找到要查询的数据,而不用对所有数据都顺序扫描一遍。实际上也就是把本应该加在表中数据上的锁加到了索引上。
另外,LZ在实验时候其实不必用VB的,使SQL SERVER自带的“查询分析器”就好了,编程的话有点累,hoho~~
【 在 iceiceberg 的大作中提到: 】
: 你的意思是针对每一个字段吧?
不是。是数据库中有一个表room,表的关键字roomno
程序中有一个控件把所有的roomno都列出来,希望能够点击某一个roomno,能在数据库中把对应的行锁起来
索引是对于以每一个列来建的……
LZ学过数据库系统概论了吧?:)
【 在 Adun 的大作中提到: 】
: 但我实际程序是他选中哪条记录,我就把那条记录锁定。
: 这样岂不是要针对每一条记录生成一个索引?太痛苦了吧。