老问题,SqlServer的<font color=#ff0000>锁机制</font> 数据库高手快来!(50分)

  • 主题发起人 主题发起人 balaschen
  • 开始时间 开始时间
我的表结构如下:
表A:
Bh:编号,Char(10)
Nd:年份,Char(4)
Jd:季度,Char(1)
Xmbh:项目编号,Char(4)
Lb:项目类别,Char(1)
其中Bh,Xmbh,Lb共同为主键,相同类别的项目相同年份,相同季度的编号相同
其中数据如下:
Bh Nd Jd Lb Xmbh
0000000001 1999 1 1 0101
0000000001 1999 1 2 0101
=================================
我有一个操作是从这个表中读出指定年份,指定季度的指定类别项目的最大编号,此时其
它用户不能修改这个表中相同类别相同项目的数据,因此我用一个事务来操作:
Begin transcation
Select IsNull(Max(Bh),0) as Bh from A with(UpdLock) where Lb='1' and Xmbh='0101' and Nd='2000' and Jd='1'
....
....
Commit transcation
现在的问题是当有两下用户同时操作该UpdLock不能很好的工作:
我先开一个进程并在事务中设了断点,即执行完上面的Select语句后,但事务并不提交,然后我
在其他机器执行包含有上述代码的程序,按理由于其他事务加了预先锁,此时此程序应该等待,
可是他却一路执行下去!更怪的是如果我把表中的年份改为2000,则在其他机器执行包含有上述
代码的程序会先等待!也就是说当我表中的数据为:
Bh Nd Jd Lb Xmbh
0000000001 2000 1 1 0101
0000000001 2000 1 2 0101
=================================
UpdLock可以很好的工作
对不起,问题有点长但为了把问题描述清楚也只有委曲各位高手了。
 
怎么没人回答?是不是嫌分数太少,我是怕给多了又没人回答浪费分数,我现在还是个穷光蛋:)
我现在已经有一个猜想只不过不知道对不对.
谁正确回答此问题再加<font color=#ff0000>100</font>分!
 
你原来的表里没有2000的记录,因此那条语句没有结果,
从而没有锁定任何记录,你在另一台机器上的程序也是如此。
存在了2000的记录后,这些记录被锁定了,另一个程序再加锁,
自然就要等待,这不是很合理么?
 
谢谢一刀大虾!你的意思是Sqlserver只锁定符合Where 后面的条件的记录?如果是这样,
那我的程序要求得到最大编号,然后再此基础上加上1再存回去该如果操作?请不吝指教谢谢!
 
没有问题呀,“最大”当然是唯一的,只要一个程序选到了,
自然就锁定了,别的程序不能再取得了。

而别的程序如果需要取得另一个年份,另一个季度的最大值,你也不应该限制呀。
>>我有一个操作是从这个表中读出指定年份,指定季度的指定类别项目的最大编号,
>>此时其它用户不能修改这个表中相同类别相同项目的数据

你前面自己不是说得很清楚么?
 
不放心可以锁住整张表。。。
 
To richar:锁住整张表是可以的,我原来就这么做的但这么一来其他用户在你表销住期间都不能
正常浏览了!
To 一刀大虾:其实我的操作是在另一个表中允许插入相同年度、相同季度、相同项目编号的数据,
相同的年度、季度、项目编号数据的不同批次用批次号区分开。当我在这个表中插入一批数据时
我就在表A中查找该年度、季度、项目编号的索引值(表A.Bh),如果存在就取出此索引号,如果不
存在就增加一个新的索引号,这样当有两个人同时<font color=#ff0000>增加相同相同年度、相同季度、
相同编号的数据且表中没有该年度、季度、项目编号的索引值</font>,这样将会产生两条
相同的年度、季度、项目编号但索引号不同的数据这是不符合要求的。其实相同的年度、季度、
项目编号数据在表A中只能有一条数,之所以用Max函数是因为这样做结果集不会为空!
 
那么似乎这样设计不太合理,想个变通的办法吧。
而且既然是两个表,那么锁住其中一个应该只会影响到
需要插入的,不影响到浏览的,因此也是一个办法
 
》》那么锁住其中一个应该只会影响到需要插入的,不影响到浏览的,因此也是一个办法
我浏览另一个表要从<font color=#ff0000>这个表读索引</font>信息。

后面我新建一个表来存放锁信息和时间值,我只是想知道不改表结构能不能实现。一刀大侠
如果没什么补充的话我明天要结束了,然后我在开一贴子给大侠加100分。
 
不要开新贴子了,分是又不是什么重要问题
这个问题我也想不出什么了...
 
多人接受答案了。
 
后退
顶部