none
触发器会不会并发? RRS feed

  • 问题

  • create table tTest1(id int identity(1,1),Val int)
    go

    create table tTest2(id int identity(1,1),Val int)
    go

    insert tTest1 values(0)
    insert tTest2 values(0)
    go

    create trigger [uTest1] on [tTest1] for update as
    begin
    declare @tmp int
    select @tmp=Val+(select Val from inserted) from tTest2--用临时变量应该会并发?
    update tTest2 set Val=@tmp
    end
    go

    --连接一
    declare @counter int
    set @counter=50000
    while @counter>0
    begin
    update tTest1 set Val=1,@counter=@counter-1
    end
    go

    --连接二
    declare @counter int
    set @counter=50000
    while @counter>0
    begin
    update tTest1 set Val=-1,@counter=@counter-1
    end

    在查询分析器同时运时连接一、连接二,结果tTest2表的Val=0,是不是触发器不会并发?如果不会并发,那么是用了什么锁呢?

    2009年9月27日 13:37

答案

  • 不管多少连接都不会并发的,否则这个数据库系统就有问题了

    你这里的触发器可以想象成有2个用户连接上来“同时”修改数据库某个内容,看上去处理速度很快,其实数据库内部机制还是一个一个排队处理的。

    数据库在update数据的时候会加锁,完成更新后释放锁,只是这个过程非常快的在交替,给你的感觉数据库在“同时”执行update。

    update 一般会加X锁。


    family as water
    • 已建议为答案 Merrica 2009年9月28日 9:14
    • 已标记为答案 SQL STUDIO 2009年9月28日 10:53
    2009年9月28日 2:34

全部回复

  • Multiple connections fire same trigger and use same inserted table, can trace that in profiler.

    2009年9月27日 18:25
  • 不管多少连接都不会并发的,否则这个数据库系统就有问题了

    你这里的触发器可以想象成有2个用户连接上来“同时”修改数据库某个内容,看上去处理速度很快,其实数据库内部机制还是一个一个排队处理的。

    数据库在update数据的时候会加锁,完成更新后释放锁,只是这个过程非常快的在交替,给你的感觉数据库在“同时”执行update。

    update 一般会加X锁。


    family as water
    • 已建议为答案 Merrica 2009年9月28日 9:14
    • 已标记为答案 SQL STUDIO 2009年9月28日 10:53
    2009年9月28日 2:34
  • 没明白,触发器并发是什么意思?


    SQL SERVER Engine Test
    2009年9月28日 2:55
    版主
  • 触发器当然是顺序执行。至于上什么样的锁,取决于你的事务的隔离级别(tracsaction isolation level)。 你的两个连接分别是两个事务,缺省的隔离级别是read committed. 请参考:http://msdn.microsoft.com/en-us/library/ms189122.aspx
    This posting is provided "AS IS" with no warranties, and confers no rights.
    2009年9月28日 4:14
  • 測試方法:
    在連接一、連接二前,加上事務。

    有出現一個阻塞,其它沒影響。可觸發器當作商務規則性的約束,使資料完整性。
    ROY WU(吳熹)
    2009年9月28日 9:03
    版主