日期:2014-05-17  浏览次数:20375 次

请教一个事务并发回滚的问题
好奇怪的问题,因为某种原因表必须是自动编号。


所以想了个办法,用事务控制并发

SQL code


BEGIN TRANSACTION

insert into aa
select bb from table

--然后这里判断并发,这里的并发都是毫秒数都一样,所以判断同ip同时间的就是并发了
select @CountNum =count(*) from aa where loginip=@ip and logintime=@now
--大于2个就回滚
if @countnum>=2
begin
    Rollback TRANSACTION
    return
end

COMMIT TRANSACTION




但是这样出现了一个惊人的问题..当并发进来后,他把2个记录都回滚了..等于我的日志表也跟就没这记录我晕

想请教下达人,对于自动编号的表,怎么来进行并发控制呢?我想只进来一条记录就行.

以前碰到过的此类问题,均是把表设置成不自动编号,然后max(id)获取到最大的记录,然后id设置主关键字段不允许重复.这样insert into的时候会报个错误,然后加上事务可以完美的回滚.但是这里表不能动的情况下,怎么来解决呢


------解决方案--------------------
sp_getapplock是对应用程序资源进行锁定的,访问取决于你的LockMode 。
如果是独占,第一个用户已经访问时已经锁定了资源,那么在资源被释放之前第二个用户是无法访问的。