怎么编写能明显验证事务级别的测试脚本?小菜鸟求教
当两个过程串行,执行的时候,第一个过程的事务级别设置,影响到第二个过程吗?

解决方案 »

  1.   

    对 我是这么理解的 不过我没测试过,你试试 
    http://zzh.javaeye.com/blog/391236
      

  2.   


    --打开两个查询窗口
    --一个输入
    BEGIN TRAN UPDATE TBALEXX SET XX='' WHERE XX=''WAITFOR DELAY '00:01'COMMIT
    --另一个输入
    SET TRANSACTION ISOLATION  LEVEL READ UNCOMMITTED;
    SELECT * FROM TBALEXX
    --等待结果出来了 再输入
    SELECT * FROM TBALEXX
      

  3.   

    事务隔离级别是针对连线的,也就是查询分析器中一个独立的查询窗口.
    默认在第2级:Read Commited.
      

  4.   

    根据我测试,却发现,统一连接的两个过程,相互之间的隔离级别并不影响(第一个过设置,第二个过程默认),没设置的一直是默认(COMMIT),有点奇怪,求大大指点。我的测试脚本/*创建测试环境*/
    Create table Status
    (
    RecordID       int not null,
        I_Batcho_No    int ,
        C_Status       varchar(255)
    )
    Insert into Status values (5,1000,'脏读')--连接一:
    USE Status_Record
    GO
    IF EXISTS (SELECT * FROM sysobjects WHERE NAME = 'TEST1'AND TYPE = 'P' )
    DROP PROCEDURE TEST1PRINT 'CREATE PROCEDURE TEST1...'
    GOCREATE PROCEDURE TEST1
    WITH ENCRYPTION
    AS  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
      SET ROWCOUNT 0
    SELECT * FROM Status_Record..Status WHERE C_Status = '脏读'
    GOUSE Status_Record
    GO
    IF EXISTS (SELECT * FROM sysobjects WHERE NAME = 'TEST3'AND TYPE = 'P' )
    DROP PROCEDURE TEST3PRINT 'CREATE PROCEDURE TEST3...'
    GOCREATE PROCEDURE TEST3
    WITH ENCRYPTION
    AS
      SET ROWCOUNT 0
      SELECT * FROM Status_Record..Status WHERE C_Status = '脏读'
    GO--EXEC TEST1
    --EXEC TEST3 // 这个一直是COMMIT的效果(默认隔离级别吗?)--连接2 
    USE Status_Record
    GO
    IF EXISTS (SELECT * FROM sysobjects WHERE NAME = 'TEST2'AND TYPE = 'P' )
    DROP PROCEDURE TEST2PRINT 'CREATE PROCEDURE TEST2...'
    GOCREATE PROCEDURE TEST2
    WITH ENCRYPTION
    AS
      SET ROWCOUNT 0
      BEGIN TRAN
    UPDATE Status_Record..Status SET I_Batcho_No = 2000 WHERE C_Status = '脏读'
    WAITFOR DELAY '00:00:10' --等待10秒
    UPDATE Status_Record..Status SET I_Batcho_No = 3000 WHERE C_Status = '脏读'
      COMMIT TRAN
    GO--EXEC TEST2
      

  5.   

    /*创建测试环境*/
    Create table Status
    (
        RecordID       int not null,
        I_Batcho_No    int ,
        C_Status       varchar(255)
    )
    Insert into Status values (5,1000,'脏读')这个是数据库在事务自动提交模式下运行的,所以等你执行完这个insert之后,就commit了
      

  6.   

    楼主的代码只是建3个存储过程,
    详细的测试步骤和结果是什么?对结果有什么疑问?这样才能回答楼主的问题呀.
    1.在连线2先 exec TEST2 ?
    2.在连线2延时的10秒期间,连线1先执行 exec TEST1 再 exec TEST3?
      

  7.   

    是的,我疏忽了!
    步骤的确是这样的:
    1.在连线2先 exec TEST2 ?
    2.在连线2延时的10秒期间,连线1先执行 exec TEST1 再 exec TEST3?结果:连线1的TEST1的设置脏读 没有影响到 TEST3,TEST3是默认的第二级;疑问:在一个连线中,设置隔离级别的作用域不是整个连线吗?我百度过,都是这么说的:设置的选项将一直对那个连接始终有效,直到显式更改该选项为止。和我测得结果不一样啊
      

  8.   

    楼主应该把SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    放到CREATE PROCEDURE TEST1 ... 之外才能设置当前连线的事务隔离级别.
      

  9.   

    否则若放存储过程里,只设置了存储过程执行过程中连线的事务隔离级别.
    对当前查询分析器中的连线1不影响,默認還是read committed.