有一张SQLSERVER表A当别人往该表插数据或修改数据时,我的java程序执行的SELECT等待,一直到别人的事务提交后,再执行我的select语句
我的程序执行SELECT语句的时候,不让别的程序往这张表插数据或删除修改数据,让别的程序等待,注意是等待,不 能让别人的程序报错。请问,我该怎么做
最好给出实际的代码。

解决方案 »

  1.   

    select ... for update,这样就加锁了
      

  2.   

    那怎么检测到别人正在插入数据?
    等到别人提交后再SELECT?
      

  3.   

    你直接Select就会等待别人释放锁啊,你并不需要理会吧如果你想知道有没有锁,可能可以试试 for update nowait 这个可能是可以,我没有试过
      

  4.   

    ChDw(米)
     
    我的业务是这样
    我在做一个接口程序别人有一个程序定期向SQL SERVER插数据
    数据形态如下
    NO      DATE1
    0001 2005-10-10 00:00:01 
    0002 2005-10-10 00:00:02
    0003 2005-10-10 00:00:03 
    0004 2005-10-10 00:00:04 
    DATE1为别人在运行INSERT那个点的时间假设在插第二条记录的时候我的程序运行了,需要SELECT
    select  no,date1,getdate() from a
    我希望等别人的程序把全部4条记录都插完并提交后,我的SELECT运行,并且这时GETDATE()函数得到的时间大于最后一条记录的时候,即大于2005-10-10 00:00:04 
      

  5.   

    如果别人的insert是在事务当中的,你的第二条的时候去select是会返回空白记录的。因为别人没有提交事务!
      

  6.   

    ChDw(米)
    是啊,我就是不希望发生这种情况啊,我希望如果别人正在INSERT的时候,我的SELECT 能自动等待,等别人都提交完了再SELECT select * from 表 with(TABLOCKX) 不知道以上的独占锁表操作可不可以实现自动等待?
      

  7.   

    要求别人提交的时候for update
      

  8.   

    好象不行吧?
    无论别人是否正在update,你的select总是会执行的.
      

  9.   

    explicitly lock the table in the insertion transaction ,and your select command will wait until the insertion transaction end.
      

  10.   

    select * from lswlzd nowait
      

  11.   

    在插入和Select都修改语句:insert into a  WITH (TABLOCK) values('1111111111',333333)
    或者
    select * from a WITH (TABLOCK)
    这样应该可以解决你需要的问题,上述都需要启动事务