原因是因为你要更新的记录被其他人使用了.
所以,当你去更新的时候,
就会跳出这个错误.
解决办法是,
先判断是否有人同时在使用这张表或当前记录,
如果有,则不更新,
如果没有,那就更新吧.
如果还不明白,
写信给我吧.
[email protected]

解决方案 »

  1.   

    george_yingjun(竹子) :
      谢谢你的回答。我仔细察看了我的程序,的确是存在你所说的情况。
      但是我不太清楚具体该如何解决它。
      你说可以先判断是否有人同时在使用这张表或当前记录,那么要如何做才能判断出是否有人在使用
    当前记录呢,有什么好的办法可用于代码实现呢?
      我给你发了一封信,上面有关于我的问题的更详细的描述,请继续关注,多谢~!
      

  2.   

    这种情况是一个典型的运行期异常;不象空指针异常,可以用之前判断
    解决问题的办法是 更新的时候使用TryCatch将他们包起来,然后提示:用户。再比如说,如果程序遇到磁盘空间不足,你会怎么处理?其实也是这样了
      

  3.   

    我现在又发现了一个怪异的问题,我编写了一个测试程序,想看看到底是什么原因造成改异常的产生。因为我不确定同时对一项纪录进行查询和更新对此是否会有影响,还是说只有当两个线程同时对一项纪录进行更新操作时才会引发异常。刚开始的时候我编写了两个线程,一个进行查询操作,另一个则对同一项纪录进行更新操作。运行结果正常。此时,我得出结论,对一项纪录可以同时进行查询和更新操作。然后我有编写了一个线程,仍然完成对同一项纪录的更新操作,同时运行这两个进行更新操作的线程。按理说,程序应该被不断的引发“被锁定,无法更新”的异常才对,可是为什么程序却仍然能够正常的运行下去呢~!太奇怪了~!粘贴其中的一部分运行结果如下:
    2003-6-15 15:21:36 : 线程a设置用户2000状态为:false
    状态设置已经成功完成!
    2003-6-15 15:21:36 : 线程b设置用户2000状态为:true
    状态设置已经成功完成!
    2003-6-15 15:21:36 : 线程a设置用户2000状态为:true
    状态设置已经成功完成!
    2003-6-15 15:21:36 : 线程b设置用户2000状态为:false
    状态设置已经成功完成!
    2003-6-15 15:21:36 : 线程a设置用户2000状态为:false
    状态设置已经成功完成!
    2003-6-15 15:21:36 : 线程b设置用户2000状态为:true
    状态设置已经成功完成!
    2003-6-15 15:21:37 : 线程a设置用户2000状态为:true
    状态设置已经成功完成!
    2003-6-15 15:21:37 : 线程b设置用户2000状态为:false这到底是怎么一回事啊?~!
      

  4.   

    实际上,使用JAVA做开发或者是练习时最好是使用Oracle,使用Access总归不太好
      

  5.   

    Access对并发性的支持相当差,如果多用户同时访问,很可能就造成问题
      

  6.   

    谢谢hlding(淋东): 
    现在我也觉得应该出现异常,可是我上面提到的那个现象又是怎么回事呢?我希望它出异常,可偏偏又运行正常~!这样一来,理论上就说不过去了~!
      

  7.   

    还是没有出现异常,部分运行结果如下:2003-6-15 16:00:21 : 线程b查询用户2000状态为:true
    状态设置已经成功完成!
    2003-6-15 16:00:21 : 线程b设置用户2000状态为:true
    通话状态:true
    2003-6-15 16:00:21 : 线程b再次查询用户2000状态为:true
    通话状态:true
    2003-6-15 16:00:21 : 线程a查询用户2000状态为:true
    状态设置已经成功完成!
    2003-6-15 16:00:21 : 线程a设置用户2000状态为:false
    通话状态:false
    2003-6-15 16:00:21 : 线程a再次查询用户2000状态为:false
    通话状态:false
    2003-6-15 16:00:21 : 线程a查询用户2000状态为:false
    状态设置已经成功完成!
    2003-6-15 16:00:21 : 线程a设置用户2000状态为:true
    通话状态:true
    2003-6-15 16:00:21 : 线程a再次查询用户2000状态为:true
    通话状态:true
    2003-6-15 16:00:21 : 线程a查询用户2000状态为:true
    状态设置已经成功完成!
    2003-6-15 16:00:21 : 线程a设置用户2000状态为:false
    通话状态:false
    2003-6-15 16:00:21 : 线程b查询用户2000状态为:false
    状态设置已经成功完成!
    2003-6-15 16:00:21 : 线程b设置用户2000状态为:false
    通话状态:false
    2003-6-15 16:00:21 : 线程b再次查询用户2000状态为:false
    通话状态:false
    2003-6-15 16:00:21 : 线程b查询用户2000状态为:false
    状态设置已经成功完成!
    2003-6-15 16:00:21 : 线程b设置用户2000状态为:true
    通话状态:false
    2003-6-15 16:00:21 : 线程a再次查询用户2000状态为:false
    通话状态:false
    2003-6-15 16:00:21 : 线程a查询用户2000状态为:false
      

  8.   

    从最后三个输出可以看到:在线程b设置用户状态的时候,线程a进行用户状态的查询,因为这个时候b还没有完成用户状态的设置,所以a查询到的用户状态为false。所以查询和用户状态更新一定是可以同时进行的。不过在这里还看不到,a和b的更新操作同时进行,我再试试另一种情况~!
      

  9.   

    怎么发不了帖子了?说我发的太快了~!sigh~
    现在我的脑子糊涂了,在同一时刻对同一记录进行了这么多次操作到底算不算是有冲突呢?不明白了,请大家帮忙分析分析,或者一起讨论一下也好啊~!
      

  10.   

    问题应该没有解决:
    做如下尝试:
    conn.setAutoCommit(false);
    state.update();
    ...记得不要使用conn.commit() 或者conn.rollback()
    在两个线程里面都是如此
    理论依据如下:
    每个connection对象对应一个事物,而默认的事务时自动提交的,那么。
      

  11.   

    setAutoCommit(false),commit(),rollback()这几个方法有什么具体的作用吗?如果不用,会产生什么不良的后果呢?因为我以前不曾接触过这些方法,所以程序里面也没有采用。你能给讲解一下吗?真得很感谢~!这么多天,程序一直没有进展,比较郁闷的说~!