JPA和Hibernate是否在没有事务开始和提交的情况下自动更新数据库
Does JPA and Hibernate automatically update database without transaction begin and commit
在 JPA 中,如果我尝试使用 setter 和 getter 方法更新托管对象而不使用事务开始和提交,考虑到 FlushType
在 AUTO
.
我使用的实现 (DataNucleus JPA) 确实允许这样做(比如自动提交模式)。如果未启用该模式,那么它将回退到标准 JPA 所做的,即保留这些更改直到下一个事务。
在 JPA 中,实体状态转换不会自动与数据库同步。如果实体附加到持久性上下文,则在 flush-time, the automatic dirty checking mechanism 将对象状态更改转换为 DML 语句。
但这需要实体由持久化上下文管理,否则不会触发脏检查机制。
尽管 JPA 规范只要求 entity state transitions 包装在逻辑事务中:
You should ALWAYS use transaction,即使只读取数据。
如果您在读取数据时没有明确使用事务,那么您将退回到自动提交模式,给连接池机制带来额外压力,并最终导致每次查询一个数据库事务。
在 JPA 中,如果我尝试使用 setter 和 getter 方法更新托管对象而不使用事务开始和提交,考虑到 FlushType
在 AUTO
.
我使用的实现 (DataNucleus JPA) 确实允许这样做(比如自动提交模式)。如果未启用该模式,那么它将回退到标准 JPA 所做的,即保留这些更改直到下一个事务。
在 JPA 中,实体状态转换不会自动与数据库同步。如果实体附加到持久性上下文,则在 flush-time, the automatic dirty checking mechanism 将对象状态更改转换为 DML 语句。
但这需要实体由持久化上下文管理,否则不会触发脏检查机制。
尽管 JPA 规范只要求 entity state transitions 包装在逻辑事务中:
You should ALWAYS use transaction,即使只读取数据。
如果您在读取数据时没有明确使用事务,那么您将退回到自动提交模式,给连接池机制带来额外压力,并最终导致每次查询一个数据库事务。