本人初学 向各位学习
是这样..
比如在服务器数据库中一个表中有一数量列
两个用户从不同客户端连接数据库后 同时对表进行update操作(比如 源数据=源数据+X 而且操作非常的同时)。
这样就会出现问题。
我想问的是1.ORACLE自身有没有防止类似操作的功能,如果没有 我该如何做才能防止此类问题。
2.update时是不是也会对表加锁,如果会加的话,两个用户单纯执行update时是不是就不会出现问题(其中一个用户被警告),但是ORACLE如何判断让哪个用户操作呢(前提是时间完全相同)。

解决方案 »

  1.   

    翻了翻书
    如果先执行update的用户不执行commit就不会释放锁
    另外的用户也就无法进行update操作。
    可是如果两用户同时进行update操作ORACLE如何处理呢。
      

  2.   

    楼主说的情况是很少出现的,oracle 是通过锁的机制来控制的,当用户A对表进行update时,会锁住表,等事务操作结束后,就会释放这个锁。 这个操作过程是非常块的,除非对一个大表做很多变更。有一种情况是可能出现的,就是用户A联到数据库后执行了
    select * from tb for update, 之后就出现网络故障,与数据库段开连接,就是重新连接后,会以一个新的session, 就的session还是会锁住表, 这时,用户A对表的锁就不会释放,其他用户也不能对表进行更新,包过用户A自己。 这时就需要手动的来kill session,来释放表的锁。
      

  3.   

    数据库有一致性读和锁的处理。你这里可以先大致了解一些其中的一些实验http://www.inthirties.com/thread-88-1-1.html
      

  4.   


    您好
    请问这位兄弟的意思是不是这样Data 
    X Y 
    4 5 step1     连接1     SQL1: UPDATE t SET x = 2 WHERE y = 5; 
    step2     连接2     SQL2: UPDATE t SET y=y+1;
    step3     连接1     SQL1:  commit
    step4     连接2     SQL2:  commit您的意思就是说 执行了step1和step2时 完成的获取是一致读
    而step3 和 step4时所完成的是当前读吗?但如果step1和step2的提交时间相同 那ORACLE又会如何处理呢?
      

  5.   

    你说的是提交时间相同,也就是step3和step4相同,那个是不可能的情况,step2会等待