1 Hibernate架构
……
8 事务和并发控制-Transactions and concurrency control
重点是理解“事务”这个术语在持久性和对象/关系映射方面不同的但相关的含义。多数情况定义一致,少数情况不是。
- 可能会参考与数据库的物理事务。
- 可能将事务的逻辑概念称为与持久性上下文相关。
- 可能会参考原型模式定义的工作单元的应用概念。
本文主要将事务的物理和逻辑概念视为同一个事物。
8.1 物理事务-physical transactions
Hibernate使用JDBC API进行持久化。
在Java世界中,有两种定义明确的机制来处理JDBC中的事务:
- JDBC本身
- JTA
Hibernate支持两种与事务集成并允许应用程序管理物理事务的机制。
每个事务Session处理由org.hibernate.resource.transaction.spi.TransactionCoordinator合同处理,该合同由org.hibernate.resource.transaction.spi.TransactionCoordinatorBuilder服务构建。 TransactionCoordinatorBuilder表示处理事务的策略,而TransactionCoordinator表示与Session相关的策略的一个实例。其TransactionCoordinatorBuilder方案中使用由定义hibernate.transaction.coordinator_class设置。
-
JDBC(非JPA应用程序的默认值)
通过调用java.sql.Connection管理事务 。 -
JTA
通过调用JTA管理事务。
如果JPA应用程序没有提供设置hibernate.transaction.coordinator_class,Hibernate将根据持久性单元的事务类型自动构建正确的事务协调器。
如果非JPA应用程序没有提供设置hibernate.transaction.coordinator_class,Hibernate将使用jdbc默认设置。如果应用程序实际使用基于JTA的事务,则此缺省值将导致问题。使用基于JTA的事务的非JPA应用程序应显式设置hibernate.transaction.coordinator_class=jta 或提供自定义org.hibernate.resource.transaction.TransactionCoordinatorBuilder,org.hibernate.resource.transaction.TransactionCoordinator以便与基于JTA的事务建立 正确的坐标。
Hibernate直接使用JDBC和JTA连接资源,而不添加任何其他锁定行为。Hibernate不会锁定内存中的对象。使用Hibernate时,数据库事务的隔离级别定义的行为不会更改。Hibernate Session充当事务范围的缓存,提供可重复读取,以便按标识符和查询进行查找,从而导致加载实体。
要减少数据库中的锁争用,物理数据库事务需要尽可能短。
长时间运行的数据库事务会阻止您的应用程序扩展到高度并发的负载。不要在最终用户级工作期间打开数据库事务,而是在最终用户级工作完成后打开它。这个概念被称为transactional write-behind。
8.2 JTA配置-JTA configuration
与JTA系统的交互在一个名为合同的合同背后进行合并,该合同org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform公开了对该系统javax.transaction.TransactionManager 和javax.transaction.UserTransaction该系统的访问,并暴露了注册javax.transaction.Synchronization实例,检查事务状态等的能力。
一般情况下,JtaPlatform将需要访问JNDI来解决JTA TransactionManager,UserTransaction等见JNDI章对配置到JNDI访问的细节。
Hibernate试图JtaPlatform通过使用另一个名为的服务来发现它应该使用它org.hibernate.engine.transaction.jta.platform.spi.JtaPlatformResolver。如果该分辨率不起作用,或者您希望提供自定义实现,则需要指定该hibernate.transaction.jta.platform设置。Hibernate提供了许多JtaPlatform契约实现,都有短名称,如下:
-
Atomikos
JtaPlatform 为Atomikos。 -
Borland
JtaPlatform 对于Borland企业级服务器。 -
Bitronix
JtaPlatform