我想知道JPA在访问数据库的时候怎样保证数据库的一致性,它能防止脏读和更新丢失吗?谢谢!

解决方案 »

  1.   

    路过,朋友加油,做了这么久JAVA 可怜我还不懂什么是jpa......
      

  2.   


    这个问题不由JPA管,是由底层数据库来管的
    如果你的数据库是oracle,那么隔离级别是Read Committed 
    如果是mysql,隔离级别是Repeatable Read 
    隔离级别是可以设置的!
      

  3.   


    Java Persistence API(jpa)
      

  4.   

    不行阿,底层数据库设置了还是会发生脏读,虽然我没看出来,但按程序逻辑看应该会发生更新丢失!我试着用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.
    不知道能不能回答一下,谢谢!
      

  5.   

    toplink JPA实现,那数据库是oracle吧
    请问你这是在做什么?测试吗?
    你想用乐观锁去避免多个请求同时更新一个数据导致不一致想象?乐观锁是基于version实现的,如果两个事务对同一个资源进行操作,version不同将会抛出异常!
      

  6.   

    也想学jpa,google的app现在不支持grails的gorm,只支持jpa和jdo.
    不知道jpa和jdo咋入门.
      

  7.   

    数据库是MySql,不是做测试,而是作毕业设计,如你所说,就是为了避免多个线程同时读取并更新数据导致数据的不一致现象。本来可以用synchronized来保证,但那样并发度就不高,所以想使用行级锁,但是JPA不提供设置数据库事务隔离级别的方法,只提供了一个lock方法,基于Version,确实是由于Version不同才抛出异常。你说,如果我是不是可以把这个异常捕获,那么接下来怎么处理呢?我不能回滚啊,不让就会丢失更新!很困惑,不知道你能不能指点我一下我该怎么办?
      

  8.   

    要入门还是很简单的,找一本JPA方面的完整的看一遍,然后想一些东西来应用JPA,然后改错就行了,呵呵!
      

  9.   


    截获系统异常,转换为自定义异常,一直往上throw,抛到表示层(如struts的action),截获异常,转发到异常界面,提示用户"由于当前并发量过大,请稍后再试!"
    jpa对所有RuntimeException默认rollback,对于Exception类和子类异常,可以用annotation去配置,具体的配置我忘记了,你可以去看看jpa文档!
    如果我找到,我回继续回复你的!
      

  10.   

    可以采用乐观锁定策略
    乐观锁定它可以确保在实体的状态从数据库读取出来,在没有中间插入的其它事物更改了与这个实体对应数据库记录的情况下,才把更新后实体的状态更新到数据库。它确保对数据的更新和删除与数据库的当前状态保持一致,并且不会丢失中间的修改。如果应用程序想启用实体的乐观锁,就必须为实体指定version属性。如果没有将乐观锁作为实体状态的一部分进行定义,应用程序就要自己去维护数据的完整性。 可以参考我的文章
    http://www.javaeye.com/topic/641637