不行阿,底层数据库设置了还是会发生脏读,虽然我没看出来,但按程序逻辑看应该会发生更新丢失!我试着用EntityManager的lock方法来锁定,却出现乐观锁异常,异常如下: Exception in thread "pool-2-thread-6" Exception in thread "pool-2-thread-7" javax.persistence.RollbackException: javax.persistence.OptimisticLockException: Exception [TOPLINK-5006] (Oracle TopLink Essentials - 2.0 (Build b40-rc (03/21/2007))): oracle.toplink.essentials.exceptions.OptimisticLockException Exception Description: The object [entities.DomainCombinationPair@b56eb4] cannot be updated because it has changed or been deleted since it was last read. 不知道能不能回答一下,谢谢!
这个问题不由JPA管,是由底层数据库来管的
如果你的数据库是oracle,那么隔离级别是Read Committed
如果是mysql,隔离级别是Repeatable Read
隔离级别是可以设置的!
Java Persistence API(jpa)
Exception in thread "pool-2-thread-6" Exception in thread "pool-2-thread-7" javax.persistence.RollbackException: javax.persistence.OptimisticLockException: Exception [TOPLINK-5006] (Oracle TopLink Essentials - 2.0 (Build b40-rc (03/21/2007))): oracle.toplink.essentials.exceptions.OptimisticLockException
Exception Description: The object [entities.DomainCombinationPair@b56eb4] cannot be updated because it has changed or been deleted since it was last read.
不知道能不能回答一下,谢谢!
请问你这是在做什么?测试吗?
你想用乐观锁去避免多个请求同时更新一个数据导致不一致想象?乐观锁是基于version实现的,如果两个事务对同一个资源进行操作,version不同将会抛出异常!
不知道jpa和jdo咋入门.
截获系统异常,转换为自定义异常,一直往上throw,抛到表示层(如struts的action),截获异常,转发到异常界面,提示用户"由于当前并发量过大,请稍后再试!"
jpa对所有RuntimeException默认rollback,对于Exception类和子类异常,可以用annotation去配置,具体的配置我忘记了,你可以去看看jpa文档!
如果我找到,我回继续回复你的!
乐观锁定它可以确保在实体的状态从数据库读取出来,在没有中间插入的其它事物更改了与这个实体对应数据库记录的情况下,才把更新后实体的状态更新到数据库。它确保对数据的更新和删除与数据库的当前状态保持一致,并且不会丢失中间的修改。如果应用程序想启用实体的乐观锁,就必须为实体指定version属性。如果没有将乐观锁作为实体状态的一部分进行定义,应用程序就要自己去维护数据的完整性。 可以参考我的文章
http://www.javaeye.com/topic/641637