关于Hibernate中读取和非锁定模式的说明?

关于Hibernate中读取和非锁定模式的说明?,hibernate,transactions,Hibernate,Transactions,根据Hibernate文档中的读取锁定模式,它是一个共享锁定。此锁定模式下的对象是在当前事务中从数据库读取的,而不是从缓存中提取的。 SessionFactory sessions = new Configuration().configure().buildSessionFactory(); Session session = sessions.openSession(); Transaction tx = null; tx = session.b

根据Hibernate文档中的读取锁定模式,它是一个共享锁定。此锁定模式下的对象是在当前事务中从数据库读取的,而不是从缓存中提取的。

     SessionFactory sessions = new Configuration().configure().buildSessionFactory();
     Session session = sessions.openSession();
     Transaction tx = null;
        tx = session.beginTransaction();
        Person p1  = (Person)session. get(Person.class,1);//line 1
         p1  = (Person)session. get(Person.class,1);//line 2
         session. lock(p1, LockMode.READ);//line 3
         p1  = (Person)session. get(Person.class,1);//line4 
         p1  = (Person)session. get(Person.class,1);//line 5
现在,根据共享锁定义保持共享锁以防止编写者对上述代码段的并发访问,我将线程保持在第4行(因此此时它已在读取模式下获得锁)。现在,我尝试从另一个线程更新id为1的人,成功了。不确定原因,因为根据定义,持有共享锁以防止写入程序并发访问

正如Read lock mode所说,此锁定模式中的对象是在当前事务中从数据库中读取的,而不是从缓存中提取的。在我的代码片段的第4行和第5行,它没有从数据库中获取id为1的行,它只从会话中获取。为什么

关于无锁模式的最后一个问题。根据文件无需锁。如果使用此锁定模式请求对象,则如果需要从数据库中实际读取状态,而不是从缓存中提取状态,则将获取读取锁定。如前所述,未获取锁定,那么开发人员为什么要获取此锁定,因为这是默认设置对吗?

现在我尝试从另一个线程更新id为1的人,它 成功。不知道为什么,因为根据定义,持有共享锁 防止写入程序并发访问的步骤

当线程1即将向数据库写入一个实体,而线程2将从中读取相同的实体时,情况如何?它们中的任何一个都应该获得一个锁来读取或写入数据。如果线程1获得写入锁,线程2必须等待写入完成。但是,如果线程2获得了读锁,那么线程1进入并写入数据就没有问题。这是因为当线程2以一致的状态读取记录时。只有在线程1写入数据库后,它才会变为陈旧状态(不过,如果是版本化实体,则线程2对此对象的写入将触发陈旧状态异常)。读锁用于防止不一致,而不是冻结记录以供同一事务进一步更新。您可以使用写锁实现这种行为

关于无锁模式的最后一个问题。根据文件,无锁 必修的。如果使用此锁定模式请求对象,则为读取锁定 如果需要从中实际读取状态,则将获取 数据库,而不是从缓存中提取它。如上所述,没有锁 那么为什么开发者会获得这个锁呢 违约对吧?

同样,为了防止实体处于不一致的状态,需要读取锁。从缓存中看,这不会是一个问题。开发人员在执行提取时不需要指定读锁,它应该由持久性提供程序在内部管理。

您可以发布在后台触发的SQL查询吗?