declare @today varchar(10)
set @today=CONVERT(varchar(10),getDate(),120) if exists(select 1 from managercounter where calendar=@today)
   insert managercounter(calendar,counter) values(@today,'1')
else
   update managercounter set counter=counter+1 where calendar=@today这样写!

解决方案 »

  1.   

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    declare @today varchar(10)
    set @today=CONVERT(varchar(10),getDate(),120) 
    begin tran tr1
    select * from managercounter where calendar=@today
    if(@@rowcount=0)
       insert managercounter(calendar,counter) values(@today,'1')
    else
       update managercounter set counter=counter+1 where calendar=@today
    GO
    commit tran tr1
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
      

  2.   

    例:create table Table1 (a int)
    go
    begin tran
      insert table1 values(1)               ----这句是对的
      insert table1 values('aaa')           ----这句由于类型不一样将报错
    commit transelect * from table1         ------结果是两句都没插入!应为他们是一个事务
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE是为了防止在事务没有完成的时候另一用户,访问事务内,未提交的数据
    create table Table1 (a int)
    go
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    begin tran
      insert table1 values(1)               ----这句在事物没有commit前,被另一个用户
                                            ----访问是错误的,应为下面有可能会出错  insert table1 values('aaa')           ----这句由于类型不一样将报错
                                            ----设置了SERIALIZABLE的话就不会发生脏读
    commit transelect * from table1
      

  3.   

    to
     pengdali(大力) (
    如果两个事务几乎同时(select 1 from managercounter where calendar=@today)
    都为true的话,那不会两次
     insert managercounter(calendar,counter) values(@today,'1')
      

  4.   

    to  tj_dns(愉快的登山者)
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    declare @today varchar(10)
    set @today=CONVERT(varchar(10),getDate(),120) 
    begin tran tr1
    select * from managercounter where calendar=@today
    if(@@rowcount=0)
       insert managercounter(calendar,counter) values(@today,'1')
    else
       update managercounter set counter=counter+1 where calendar=@today
    GO
    commit tran tr1
    为社么只需要READ UNCOMMITTED
    我觉得不对啊
      

  5.   

    读后不提交,也就是
    select * from managercounter where calendar=@today
    之后,记录没有开锁,其他用户不能插入或修改,直到COMMIT。
      

  6.   

    那么
    为社么READ COMMITTED比READ unCOMMITTED地级别高呢?
    在这里用READ COMMITTED反而不好。
      

  7.   

    用updlock就可以解决问题
    declare @today varchar(10)
    set @today=CONVERT(varchar(10),getDate(),120) 
    select * from managercounter (updlock) where calendar=@today
    if(@@rowcount=0)
       insert managercounter(calendar,counter) values(@today,'1')
    else
       update managercounter set counter=counter+1 where calendar=@today
    GO