存储过程里的全部语句,会当作一个事务处理吗?
比如一个业务,删除某表数据,同时又增加另一个表的数据,同时可能还要有人来读数据,在过程中怎么做呢?

解决方案 »

  1.   

    如果你没有用begin transaction的显式事务形式,每一句DML语句都会被当作一个事物隐式的提交
      

  2.   

    提交嵌套事务。
    下面的示例创建一个表,生成三个级别的嵌套事务,然后提交该嵌套事务。尽管每个 COMMIT TRANSACTION 语句都有一个 transaction_name 参数,但是 COMMIT TRANSACTION 和 BEGIN TRANSACTION 语句之间没有任何关系。transaction_name 参数仅是帮助阅读的方法,可帮助程序员确保提交的正确号码被编码以便将 @@TRANCOUNT 减少到 0,然后提交外部事务。CREATE TABLE TestTran (Cola INT PRIMARY KEY, Colb CHAR(3))
    GO
    BEGIN TRANSACTION OuterTran -- @@TRANCOUNT set to 1.
    GO
    INSERT INTO TestTran VALUES (1, 'aaa')
    GO
    BEGIN TRANSACTION Inner1 -- @@TRANCOUNT set to 2.
    GO
    INSERT INTO TestTran VALUES (2, 'bbb')
    GO
    BEGIN TRANSACTION Inner2 -- @@TRANCOUNT set to 3.
    GO
    INSERT INTO TestTran VALUES (3, 'ccc')
    GO
    COMMIT TRANSACTION Inner2 -- Decrements @@TRANCOUNT to 2.
    -- Nothing committed.
    GO
    COMMIT TRANSACTION Inner1 -- Decrements @@TRANCOUNT to 1.
    -- Nothing committed.
    GO
    COMMIT TRANSACTION OuterTran -- Decrements @@TRANCOUNT to 0.
    -- Commits outer transaction OuterTran.
    GO
      

  3.   

    表Table1中存储的是状态数据,一条记录包含一个物品的状态。
    如果A用户修改某物品状态,则B不能修改和读取该物品状态,但要等待,且能知道Table1中有他需要的该物品状态,等A修改完之后,B马上修改。
    该怎么做呢?
      

  4.   

    不用做什么特殊的设计,像平常那样在存储过程中写你的SQL语句就好了,多用户之间的事务隔离SQL SERVER会帮你很好地解决问题的。
      

  5.   

    我的是SQL2000
    不同的事务调用相同的数据,会自动处理吗?
      

  6.   

    会的,你所说的:
    表Table1中存储的是状态数据,一条记录包含一个物品的状态。
    如果A用户修改某物品状态,则B不能修改和读取该物品状态,但要等待,且能知道Table1中有他需要的该物品状态,等A修改完之后,B马上修改。
    ——————————————————————————
    SQL SERVER能帮助你完成你的工作