当前位置: 代码迷 >> Sql Server >> 事宜与lock
  详细解决方案

事宜与lock

热度:77   发布时间:2016-04-27 12:08:13.0
事务与lock
生成记录的过程
SQL code
BEGIN TRANSACTIONdeclare @maxid int,@ID varchar(50)set @maxid=0select @maxid=[MaxRecordNo] from [MaxRecordNoTable] where [TableName]=XXset @[email protected]+1...insert into XX values(@maxid)...update [MaxRecordNoTable]  set [MaxRecordNo][email protected]  where [TableName]=XXCOMMIT TRANSACTION
其中通过查表的的方式来生成唯一记录号并插入记录 但是发现插入的部分记录并没有唯一 
SQL code
select count(RecordNo) from XX where RecordNo in (select RecordNo from XX group by RecordNo having count(RecordNo)>1)

请问为什么事务没起到作用 在并发多用户连接的情况下

------解决方案--------------------
提高下事务的隔离级别
------解决方案--------------------
实在不行,把事务序列化,呵呵,不过正常不会这么做
整型的列就用自增的呗,又不是流水号,必须有英文在里面

还有你刚开始就把maxid给select,然后又执行了n步,才新增到表maxid+1,此时都不知道数据库中实际的已是多少了,在insert into XX values(@maxid)...[email protected]
insert into XX values(select [MaxRecordNo]+1 from [MaxRecordNoTable] where [TableName]=XX)
------解决方案--------------------
SQL code
BEGIN TRANSACTIONdeclare @maxid int,@ID varchar(50)set @maxid=0select @maxid=[MaxRecordNo] from [MaxRecordNoTable] where [TableName]=XXupdate [MaxRecordNoTable]  set [MaxRecordNo][email protected]+1  where [TableName]=XX--紧接着就修改set @[email protected]+1...insert into XX values(@maxid)...COMMIT TRANSACTION
------解决方案--------------------
使用Update 中使用with(rowlock,holdlock)控制

e.g.
begin tran
Declare @maxid int
update MaxRecordNoTable 
set @maxid=[MaxRecordNo] ,[MaxRecordNo]=[MaxRecordNo]+1
from [MaxRecordNoTable] with(rowlock,holdlock)
where [TableName]=XX

insert into XX values(@maxid)..
......

commit tran



------解决方案--------------------
BEGIN TRANSACTION
declare @maxid int,@ID varchar(50)
set @maxid=0
select @maxid=[MaxRecordNo] from [MaxRecordNoTable] with(pagelock,Xlock) where [TableName]=XX
set @[email protected]+1
...
insert into XX values(@maxid)...
update [MaxRecordNoTable] set [MaxRecordNo][email protected] where [TableName]=XX
COMMIT TRANSACTION


在你读取的时候。别人也同时读取是可以的。所以应该限定在读取时锁定不让别人读取即可
------解决方案--------------------
select @maxid=[MaxRecordNo] from [MaxRecordNoTable] with(HOLDLOCK) where [TableName]=XX
------解决方案--------------------
[url=http://blog.csdn.net/zhazhuzhao/article/details/7708362[/url]
我的博客中有个例子,6楼的,也差不多,你可以看看。事务在默认情况下,select之后就把锁释放了,别人同样可以读,而不用等待,所以最好的办法是在一句话中完成更新与赋值。
------解决方案--------------------
try this,
SQL code
set transaction isolation level serializablebegin transactiondeclare @maxid int,@ID varchar(50)set @maxid=0select @maxid=[MaxRecordNo] from [MaxRecordNoTable] where [TableName]=XXset @[email protected]+1...insert into XX values(@maxid)...update [MaxRecordNoTable]  set [MaxRecordNo][email protected]  where [TableName]=XXcommit transaction
  相关解决方案