我有一个数据表,我要用程序一边取这表的数,还有一个程序往这个表里面写数.我写一个存储存过程,先把这个表的数据全部取出来然后再全部清掉,在这期间有没有可能另一个程序把数据给写进来呀.就是我在取完数以后删除以前,会不会有数据写进来呀.大家给说明一下吧

解决方案 »

  1.   

    在游标定义中,普通的定义方法为:
    DECLARE authors_cursor CURSOR FOR SELECT au_id, au_fname, au_lname FROM authors
    这时,只能浏览或取表中的值,将语句改为:
    DECLARE authors_cursor CURSOR FOR SELECT au_id, au_fname, au_lname FROM authors
     For Update 
    也就是在原语句的后面增加For Update 就可以了
      

  2.   

    DECLARE authors_cursor CURSOR FOR SELECT au_id, au_fname, au_lname FROM authors
     For Update OF 更新的列表.....
      

  3.   

    我只是想实现这样的功能呀.
    先select * from xzt
       delete from xzt 
    就是担心在这两句之间操作时会有数据写进来呀
      

  4.   

    --trybegin tran
    declare @i1 int, @i2 int
    select * from xzt
    set @i1=@@rowcountdelete from xzt
    set @i2=@@rowcountif @i1=@i2
    commit tran
    else
    rollback tran
      

  5.   

    楼主是想保证select 和 delete 之间, 没有数据被修改而已, 还是连新增的符合条件的数据也不允许?如果是前者, 将事务隔离级别提高到: REPEATABLE READ
    如果是后者, 则事务隔离级别必须提供到: SERIALIZABLE
      

  6.   

    -- 下面通过一个试验来说明问题-- 1. 建立测试环境
    USE tempdb
    GOCREATE TABLE dbo.tb(id int PRIMARY KEY)
    INSERT dbo.tb SELECT 1
    UNION ALL SELECT 2
    UNION ALL SELECT 3
    UNION ALL SELECT 4
    UNION ALL SELECT 5
    GO
      

  7.   

    -- 2.a 新开一个查询窗口, 输入下面的语句
    USE tempdb
    GOSET TRANSACTION ISOLATION LEVEL
    -- REPEATABLE READ
    SERIALIZABLE DECLARE @id int
    SET @id = 3
    BEGIN TRAN
    SELECT * FROM dbo.tb WHERE id < @id
    WAITFOR DELAY '00:00:10'
    DELETE FROM dbo.tb WHERE id < @id
    COMMIT TRANSELECT * FROM dbo.tb
    GO
      

  8.   

    -- 2. b 新开一个查询窗口, 输入下面的语句
    USE tempdb
    GOINSERT dbo.tb VALUES(0)
      

  9.   

    测试的时候, 先执行第1步的语句, 创建好测试环境然后切换到查询窗口 2.a, 按F5执行, 紧接着(不要等待2.a执行完成), 切换到查询窗口2.b执行.如果查询窗口2.a中, 事务隔离级别设置的语句设置的事务隔离级别是: REPEATABLE READ
    你会发现2.b很快执行完成, 5秒钟后, 检查 2.a , 你会发现 2.a 把 2.b 新插入的 id = 0 的记录删除掉了如果查询窗口2.a中, 事务隔离级别设置的语句设置的事务隔离级别是: SERIALIZABLE
    则2.b不会立即执行完成, 而要到2.a执行完成事务后才会完成, 5秒钟后, 检查 2.a , 你会发现 2.a 无法把 2.b 新插入的 id = 0 的记录删除掉
      

  10.   

    为了测试更新, 2.b的语句还可能需要换成下面的:UPDATE dbo.tb SET id = 11 WHERE id = 1你会发现, 无论事务隔离级别是 REPEATABLE RED, 还是 SERIALTZABLE, UPDATE都是被阻止到 2.a 的事务完成的.注意:
    每次测试请重新建立测试环境.
      

  11.   

    SET TRANSACTION ISOLATION LEVEL
    --REPEATABLE READ
    SERIALIZABLE 请问这句话是什么意思??
      

  12.   

    sql边取边存问题 ,袁峰老大请进 
    --------------
    呵呵,这里是邹老大的地盘~~~