hibernate - @Transactional(propagation = Propagation.NOT_SUPPORTED) 与根本没有 @Transactional 注释
问题描述
传播.NOT_SUPPORTED。以非事务方式执行,如果存在则暂停当前事务。
@Transactional(propagation = Propagation.NOT_SUPPORTED)
与以下示例中根本没有注释相同@Transactional
,前提是它m()
不是从另一个@Transactional
方法调用的:
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void m() {
repo.insert(new B()); //insert() method is annotated with @Transactional(propagation = Propagation.REQUIRED)
}
是否为该insert()
方法创建了新事务?什么时候应该Propagation.NOT_SUPPORTED
使用?
解决方案
@Transactional(propagation = Propagation.NOT_SUPPORTED)
和没有一样吗@Transactional
?不,当我们从已经启动事务的方法调用 m() 时,它首先暂停当前事务,然后执行其工作,然后在返回后恢复暂停的事务。在没有@Transaction 的情况下,它不会暂停正在进行的事务。查看以下日志:
osorm.jpa.JpaTransactionManager.getTransaction - []
Creating new transaction with name
[] ohetinternal.TransactionImpl.begin - []begin
。. osorm.jpa.JpaTransactionManager.handleExistingTransaction - []Suspending current transaction
。. . osorm.jpa.JpaTransactionManager.cleanupAfterCompletion - []Resuming suspended transaction after completion of inner transaction
是否为 insert() 方法创建了新事务?
是的,插入方法将开始新事务。
ohetinternal.TransactionImpl.begin -
[ ] begin
[ ]Initiating transaction commit
[ ]committing
注意:在 insert() 事务提交后,暂停的事务被恢复。
3.什么时候应该使用Propagation.NOT_SUPPORTED?
不太确定,您希望代码以非事务方式运行。如果以某种方式从事务所在的上下文中输入此代码,则暂停此事务并以非事务方式继续。
推荐阅读
- django - 带有多对多 InlineFormset ValueError 的 Django CreateView- ModelForm
- ruby-on-rails - 有没有办法在连接表中键入枚举列的强制转换值?
- winapi - 如何在 PC 上为 SHGetKnownFolderPath 获取每个用户令牌?
- unity3d - 使用 Vimeo SDK 和 AVPro Video 时 Unity 中的自适应分辨率错误
- python - AWS SES 发送批量模板电子邮件返回“模板数据无效”
- javascript - 复选框将所有选项存储到数据库中,而不是一个
- c++ - 将外部文件添加到 makefile
- python - What is the equivalent of SENTRY_USER_ATTRS in the new SDK sentry-sdk/sentry-python?
- reactjs - React / Redux - mapStateToProps 中用于延迟状态加载的函数道具是否不好?
- swift - Swift:识别应用 NSLayoutConstraint 的对象