Spring的事务类型

本文详细介绍了Spring框架中提供的各种事务传播行为,包括PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW等,并探讨了如何通过配置事务属性来优化读取操作及在使用Hibernate时的数据刷新机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=large]Spring提供了以下事务类型[/size]
1. PROPAGATION_REQUIRED:支持当前正在运行的事务,如果事务不存在则创建新的事务
2. PROPAGATION_REQUIRES_NEW:永远创建新的事务,如果当前存在事务则先挂起该事务的执行。
3. PROPAGATION_SUPPORTS:如果在事务上下文中执行,则支持当前存在的事务,否则不支持事务
4. PROPAGATION_MANDATORY:方法必须参与事务,如果不存在事务,则抛出异常。
5. PROPAGATION_NESTED:困惑
6. PROPAGATION_NOT_SUPPORTED:方法不参与事务,如果在事务上下文中运行,则挂起当前执行的事务
7.
8. PROPAGATION_NEVER:方法在不参与事务,如果在事务上下文中运行,则抛出异常
其中nested方式在ejb中也无对应,项不出应用的场景。
事务的隔离级不赘述。
Spring 的事务提供了一个readOnly的属性,该属性对事务处理进行了优化,该属性要来处理查询操作。对于增、删、改的操作则不能配置该属性。在使用 HibernateTransactionManager时,对readOnly属性,Hibernate Session不做检测,数据不会flush到数据库。
Spring提供了HibernateTemplate来管理session的生存期。在这种机制下对增删改必须配置事务属性。否则数据库将不被更新

不知道我的这些理解是否正确,提出来希望能够得到指正。

HibernateTemplate可以单独使用,不一定要配置事务属性
刷新数据是根据flush mode和是否存在事务共同判断的
刷新操作是在HibernateAccessor类的flushIfNecessary方法中执行的
flushIfNecessary方法如下
public void flushIfNecessary(Session session, boolean existingTransaction) throws HibernateException {
if (getFlushMode() == FLUSH_EAGER || (!existingTransaction && getFlushMode() == FLUSH_AUTO)) {
logger.debug("Eagerly flushing Hibernate session");
session.flush();
}
}


如果flush mode是FLUSH_EAGER,无论存不存在事务,都立即刷新。
如果不存在事务而flush mode是FLUSH_AUTO,则立即刷新,否则刷新操作将由事务控制。
flushIfNecessary在HibernateTemplate的execute方法中被调用,HibernateTemplate提供的数据访问操作最终都是调用execute实现的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值