日期:2014-05-20  浏览次数:20946 次

有关hibernate 并发的疑惑,求达人指教
我根据数据库表用myclipse自动生成对应的DAO,增加了事务处理.然后开两百条线程对表进行save,delete,会出现一下错误
1 R java.lang.NullPointerException
  R at fes.common.dao.FesAuditcodeDAO.save(FesAuditcodeDAO.java:43)
2. R org.hibernate.TransactionException: Transaction not successfully started
3. R org.hibernate.HibernateException: identifier of an instance of fes.common.dao.entity.FesAuditcode was altered from 402882e11b6d73c0011b6d73cbcd0003 to 402882e11b6d73c0011b6d73cbdc0005
如果在save,delete方法加上synchronized的话,这些错误就不会出现.请问是哪里出了问题?

------解决方案--------------------
synchronized一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候 当前线程执行完该方法后,别的线程才能进入.
identifier of an instance of fes.common.dao.entity.FesAuditcode was altered from 402882e11b6d73c0011b6d73cbcd0003 to 402882e11b6d73c0011b6d73cbdc0005说明原有的主键发生变化了,因为所有线程共用一个session中的save方法。
假如有俩个线程A和B一前一后并发访问save,A的主键为402882e11b6d73c0011b6d73cbcd0003,B的主键为402882e11b6d73c0011b6d73cbdc0005,而事物提交是一个,俩个线程共用一个session所有主键为最新设置的B的主键。
------解决方案--------------------
数据库级出现冲突了,试一下
Session.lock()
------解决方案--------------------
identifier of an instance of fes.common.dao.entity.FesAuditcode was altered from
似乎是FesAuditcode类在不同的session修改导致的
------解决方案--------------------
就是说在一个session中的一个持久化对象,这个session还没有结束,又被另一个session更改了
导致了这个问题,仔细检查一下代码吧
------解决方案--------------------

up``
------解决方案--------------------
synchronized方法,一次只能有一个线程访问,如果同时有多个线程访问其它的要等到该线程运行完毕再执行该方法。
而在同一个seesion中,一次只能save一条数据。