Java JPA、JTA中的逻辑工作单元和单个工作单元

Java JPA、JTA中的逻辑工作单元和单个工作单元,java,hibernate,jpa,transactions,jta,Java,Hibernate,Jpa,Transactions,Jta,我经常遇到这些术语。他们两个之间有区别吗 在以下Java代码中,该方法是线程安全的: class Counter { private int i = 0; public synchronized void inc() { i++; } } 在会话工厂和Hibernate中的会话上下文中 SessionFactory (org.hibernate.SessionFactory) - A thread-safe Session (org.hibernat

我经常遇到这些术语。他们两个之间有区别吗

在以下Java代码中,该方法是线程安全的:

class Counter {
    private int i = 0;

    public synchronized void inc() {
        i++;
    }
}
在会话工厂和Hibernate中的会话上下文中

SessionFactory (org.hibernate.SessionFactory) - A thread-safe

Session (org.hibernate.Session) - A single-threaded, short-lived object representing a   
conversation between the application and the persistent store. 
我在理解他们的定义时感到困惑

我所了解的是,由于SessionFactory线程安全的,因此任何线程首先需要获取锁,然后才能对其进行操作,即实现在被多个线程同时访问时保证没有争用条件。(注意我同时写了,而不是平行写了)。一个线程完成工作后,队列中的另一个线程将获取锁,依此类推。没有两个线程会同时处理它

会话不是线程安全的
,它代表一个单线程工作单元


是否在sessionfactory之后,多个会话(在sessionfactory中)将在各自的单线程中扩展各自的工作范围?

sessionfactory是线程安全的,并且您有一个针对给定数据源的单实例sessionfactory

会议可以进行

会话始终必须在任何给定时间绑定到单个线程。即使使用扩展持久性上下文,在一个时间点访问会话也只有一个请求/线程

因此,不应同时访问会话。这就是为什么您不需要同步您的实体,至少从Hibernate的角度来看是这样。每个会话加载它自己的一个实体副本,并发性通常是由确保的,因为它需要有

因此,实体不应该同步。并发控制发生在数据库内部,而不是应用程序逻辑中。每个客户端请求将始终在物理数据库事务的范围内发出DML语句,以及

总而言之,会话及其所有连接的实体都是不安全的。会话工厂是线程安全的,因为每个数据源只有一个单例实例,您可以使用它来创建新会话