Hibernate事务与锁机制详解
立即解锁
发布时间: 2025-08-19 02:20:12 阅读量: 1 订阅数: 9 


专业Hibernate:Java持久化解决方案
# Hibernate 事务与锁机制详解
## 1. Hibernate 数据存储流程与事务的必要性
Hibernate 在存储对象时,其 SQL 执行顺序如下:
1. 存储 Group 对象。
2. 存储 Story 对象。
3. 根据 Group 对象的标识符(主键)更新 Story 对象。
其中,步骤 3 尤为重要,它建立了 Story 对象行与 Group 对象行之间的关联。但在这个过程中,任何一步出现错误都会导致数据库的完整性问题:
- **情况 1**:步骤 1 出错,如存储 Group 对象时列值或标识符值有误,数据库服务器会报错。
- **情况 2**:步骤 2 出错,存储 Story 对象时可能出现属性值或生成的标识符问题。
- **情况 3**:若步骤 1 或 2 出错,步骤 3 也会失败。例如,若要持久化 5 个 Story 对象,其中 1 个失败,步骤 3 的 SQL 只会更新 4 行,导致列表中丢失 1 个对象。
为解决数据库完整性问题,引入了事务机制。
## 2. 事务的定义与特性
事务是一个工作单元,有成功或失败两种结果。以保存 Group 对象、Story 对象及更新数据库行关系为例,这些步骤构成一个事务。若事务中任何一步失败,整个事务失败,数据库会回滚之前的所有更改;若各步骤无错误,更改将被提交。
然而,事务也有成本,不同数据库服务器的成本不同,执行事务时会涉及表锁定和决策操作。
## 3. Hibernate 事务配置
默认情况下,Hibernate 在持久化数据到数据库时不使用事务。可通过以下两个配置选项处理事务:
- `hibernate.transaction.factory_class`
- `jta.userTransaction`
- `hibernate.transaction.manager_lookupclass`
其中,`hibernate.transaction.factory_class` 最为重要,它指定 Hibernate 使用的事务机制:
- **JDBC 事务**:在非应用服务器环境中使用。设置 `hibernate.transaction.factory_class` 为 `net.sf.hibernate.transaction.JDBCTransactionFactory`,Hibernate 将使用 JDBC 驱动的事务功能。
- **JTA 事务**:在应用服务器环境中使用。设置 `hibernate.transaction.factory_class` 为 `net.sf.hibernate.transaction.JTATransactionFactory`,该机制适用于分布式事务,使用时需根据应用服务器指定策略。具体应用服务器对应的 `hibernate.transaction.manager_lookupclass` 值如下表所示:
| 应用服务器 | 工厂类 |
| --- | --- |
| Jboss | net.sf.hibernate.transaction.JbossTransactionManagerLookup |
| Weblogic | net.sf.hibernate.transaction.WeblogicTransactionManagerLookup |
| WebSphere | net.sf.hibernate.transaction.WebSphereTransactionManagerLookup |
| Orion | net.sf.hibernate.transaction.OrionTransactionManagerLookup |
| Resin | net.sf.hibernate.transaction.ResinTransactionManagerLookup |
| JOTM | net.sf.hibernate.transaction.JOTMTransactionManagerLookup |
| JOnAS | net.sf.hibernate.transaction.JOnASTransactionManagerLookup |
| JRun4 | net.sf.hibernate.transaction.JRun4TransactionManagerLookup |
## 4. 数据库对事务的支持
事务并非 JDBC 或 JTA 天然支持的,其核心操作由数据库服务器完成。执行事务时,应用将 SQL 告知 JDBC 驱动,驱动执行 SQL 操作数据库。若最后一个 SQL 查询出错,数据库服务器需回滚之前的更改。因此,应用使用的表必须支持事务。
多数商业数据库(如 Oracle、Microsoft SQL Server)支持事务,但开源数据库需注意。以 MySQL 为例,默认的 ISAM 表类型不支持事务,支持事务的表类型有 InnoDB 和 BDB。
此外,还需关注事务的隔离级别,不同隔离级别下,并发进程访问数据库的结果不同。常见的隔离级别及解决的问题如下表所示:
| 名称 | 脏读 | 不可重复读 | 幻读 |
| --- | --- | --- | --- |
| Read Uncommitted | 可能发生 | 可能发生 | 可能发生 |
| Read Committed | 不会发生 | 可能发生 | 可能发生 |
| Repeatable Read | 不会发生 | 不会发生 | 可能发生 |
| Serializable | 不会发生 | 不会发生 | 不会发生 |
不同数据库服务器有不同的默认隔离级别:
- MySQL 的 InnoDB 和 BD
0
0
复制全文
相关推荐










