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)"并没有回滚,就可以证明了!
insert into mytable (xxx)value (XXX) select * from 临时表 会锁表表吗 会进行事务回滚吗
insert into mytable (xxx)value (XXX)select * from 表变量 会锁表表吗 会进行事务回滚吗
第一个 如果是本地临时表 就不锁表 如果是全局的 就锁全局表 这个锁具体是什么我也不清楚 猜测是mytable 有INsert的排他锁 全局临时表 有共享锁
第二个 应该是不锁表
不知道我的答案对不对 求解答
还有 我需要验证的方法 是否锁表 具体是那种锁 需要验证
真正要关注的不是一两条SQL语句,而是索引的设置和查询的执行效率,你的领导不问你执行效率如何,反而问你这个。一个存储过程,不在意效率的话,当数据千万条的时候,执行一次需要一根烟还不止的时间,这时多数人只会更换更好的服务器,的确,服务器性能提高后,执行效率能够大大提高,但是优化查询语句也是提供效率的方法,而且是不花钱的方法。
不需要等到发生错误了再回滚,完全可以手动控制何时回滚的。
另外当发生错误时,所执行的那条SQL语句本身将自动回滚,而调用rollback是对其之前执行的语句进行回滚。(如果有commit,commit之前的部分无法回滚,另外SQLSERVER是嵌套事务,最外层事务未提交则不是真正的提交)。
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)"并没有回滚,就可以证明了!