
之所以有效,是因为您足够幸运。足够幸运的是,以正确的顺序调用了commit和begin-偶然地。
您确实从多个线程使用了实体管理器的单个实例。这样做是错误的,因为不能保证它是线程安全的。通过EntityTransaction对资源级事务的访问绑定到实体管理器实例,而不是线程。
因此,结果是您共享同一个EntityTransaction,并幸运地将其连续用于多个事务。串行使用它来终止和终止多个事务是可以的,但是从多个线程使用它不是。
在hibernate(4.1.4)中,引用存储到AbstractEntityManageImpl类中的tx实例字段,但这只是实现细节。