No Relastionship 

解决方案 »

  1.   

    是我的错 没描述清楚 如下 数据库sql2008
    insert into mytable (xxx)value (XXX) select * from 临时表 会锁表表吗 会进行事务回滚吗
    insert into mytable (xxx)value (XXX)select * from 表变量 会锁表表吗 会进行事务回滚吗 
      

  2.   

    我的答案是 两个都回事务回滚
    第一个 如果是本地临时表 就不锁表  如果是全局的 就锁全局表 这个锁具体是什么我也不清楚 猜测是mytable 有INsert的排他锁 全局临时表 有共享锁
    第二个 应该是不锁表
    不知道我的答案对不对 求解答 
    还有   我需要验证的方法  是否锁表 具体是那种锁 需要验证
      

  3.   

    在你没有显示指定Begin Tran的情况下,所有修改操作都是原子的,如果你的Insert语句执行时间较长,需要1分多种,那么在这个1分多种里面,下插入的数据无法被访问,以前存在的则可以,它不会锁表,但会对为提交的数据部分锁定,当Insert语句执行完就自动提交单笔事务,并释放数据行锁(其实插入的情况就没有锁的存在),只有当你显示指定Begin Tran的情况,才能将所有操作一起提交或回滚。
      

  4.   

    补充一个小知识点,Oracle里面发生要访问的资源被锁定的情况则不会报错,它会无限等待下去,且查询用不超时(超时设定无效)。反正具体问题实际测试下就知道了,对于SQLSERVER来说,本地建个测试库都没问题。
      

  5.   

    举个例子 我说select是共享锁 领导问 为什么是共享锁 我就只能说 书上写的 或者网上查的 领导让我证明下 select是共享锁 我就不会了
      

  6.   

    你反问领导,为什么有风险?这种领导真会刁难人,没本事就专门吹毛求疵。我前面说了,不需要知道什么锁,这对写存储过程毫无意义,SQLSERVER本身就不让你单独设置锁,整个过程都是自动的。还有临时表的数据是否回滚也不重要,因为临时表在执行结束后,内部数据自动清空,如果是局部定义的临时表,则连表本身都不存在了,因此根本不会有人关心临时表里面的数据。
    真正要关注的不是一两条SQL语句,而是索引的设置和查询的执行效率,你的领导不问你执行效率如何,反而问你这个。一个存储过程,不在意效率的话,当数据千万条的时候,执行一次需要一根烟还不止的时间,这时多数人只会更换更好的服务器,的确,服务器性能提高后,执行效率能够大大提高,但是优化查询语句也是提供效率的方法,而且是不花钱的方法。
      

  7.   

    查询出来了 经过测试 那两个语句 对表mytable执行意向共享锁  通过查询系统视图dm_tran_locks 可以论证 但回滚还没法解决
      

  8.   

    不废话了,一定要验证是否回滚,很简单,只要你写个最简单的SQL语句,第一行先开启事务,然后往临时表插入数据,然后执行rollback回滚,再执行Select查询临时表即可(结果肯定和正式表一样)。
    不需要等到发生错误了再回滚,完全可以手动控制何时回滚的。
    另外当发生错误时,所执行的那条SQL语句本身将自动回滚,而调用rollback是对其之前执行的语句进行回滚。(如果有commit,commit之前的部分无法回滚,另外SQLSERVER是嵌套事务,最外层事务未提交则不是真正的提交)。
      

  9.   


        declare @ids table([FID] [int] NOT NULL) insert into @ids values(3)    begin tran 
    begin try
            insert into @ids values(1)
    insert into @ids values(10/0)
    commit tran 
    end try
    begin catch     
    rollback tran ;        
    end catch select * from @ids
    从返回结果来看"insert into @ids values(1)"并没有回滚,就可以证明了!