首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

询问一个DBCC CHECKIDENT与事务的有关问题

2012-09-04 
询问一个DBCC CHECKIDENT与事务的问题背景:有两张表 Test 10 与 Test 11。表的结构如下:Test 10 有两个字段

询问一个DBCC CHECKIDENT与事务的问题
背景:
  有两张表 Test 10 与 Test 11。表的结构如下:
  Test 10 有两个字段分别是: cniId (int,自增) ,cnvcUseName (varchar)
  Test 11 有两个字段分别是: cniId (int,自增) ,cnvcUseName (varchar)
需求:
  Test 11表的cnvcUserName字段的值,为 Test 10表当前 cniId字段 的值+1;

设计:
  存储过程INSERT_TEST11:

SQL code
     BEGIN    DECLARE @nextId int;    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;    BEGIN TRANSACTION;        SELECT @nextId=IDENT_CURRENT( 'Test10' ) +1;        DBCC CHECKIDENT( 'Test10',RESEED, @nextId);        SELECT @nextId;        INSERT INTO Test11 (cnvcUseName) VALUES (@nextId);    COMMIT TRANSACTION;   END


  存储过程INSERT_TEST10:
 
SQL code
   BEGIN     SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;     BEGIN TRANSACTION;    INSERT INTO Test10 (cnvcUseName) VALUES (GETDATE());     COMMIT TRANSACTION;   END  


本意是通过事务进行表锁,在并发的情况下。不会出现
SELECT * FROM Test10 A JOIN Test11 B ON A.cniId = B.cnvcUseName; 的情况,结果在做压力测试时,的确出现了相同的值。

询问一下该方案存在问题的地方?



[解决办法]
你最后哪一个JOIN 没看懂

不知道你想测试上面,你这里的select 取值不指定锁是排除不掉并发的

有重复的@nextId 很正常。
[解决办法]
两种办法 一种是增加表的粒度,一种是修改隔离级别。

热点排行
Bad Request.