synchronized加锁的是程序中的对象,而不是数据库中的表。
应该指定联结操作数据库的方式为排他性锁,才可以保证。

解决方案 »

  1.   

    ejb我不太懂,我想这个问题ejb肯定有它自己的解决方法。
    其实可以自己做一个对整个表的锁,每个bean在对表操作前都要检索该表是否已经被锁住。
      

  2.   

    如果出该方法之外没有其他地方对相同表进行操作,楼主这样就够了。
    对数据库的表进行加锁不好,一旦事务未提交或回滚之前程序当掉,那加的锁就一直解不了了。我们现在使用一套update count机制,每个表里都有一个updatecount字段,提交更改时把updatecount加1,别的并发事务在开始的时候取updatecount的值,提交前再取一次,如果变化了,表示数据已经dirty,就会滚事务。否则,把updatecount加1,提交事务。
      

  3.   

    An enterprise Bean must not use thread synchronization primitives to synchronize execution of
    multiple instances. Synchronization would not work if the EJB Container distributed enterprise
    bean instances across multiple JVMs.
      

  4.   

    我已经用了一种类似update count的方法,数据表中都有updateTime字段,判断这个字段就可以知道数据是不是被别人修改过。现在ejb中的synchronized其实已经没用了,但是我还是写了,因为客户说:要看见这个字他才放心。只是希望加上他不会出问题。现在想起来:ValueObject模式中有一个rowVersion,应该就是避免并发造成脏数据的。