java - @Transactional 的范围
问题描述
例如,我有一个类似这样的代码
@Transactional(propogation=PROPOGATION.REQUIRED)
public class codeForTest {
public void doSomethins(){
User user = userRepository.finduserById(userId);
updateUserDetails(user);
updateFewOtherDetails(user);
}
}
public class DifferentClass{
@Transactional(propogation=PROPOGATION.REQUIRED)
updateUserDetails() {
//UPDATES user object
}
}
在具有上述逻辑的几个实例中,我得到了以下信息。我在本地机器上没有收到错误。我的问题是 updateUserDetails() 是否会提交事务,并且在执行 updateFewOtherDetails() 时,由于事务已提交,是否会引发异常?我怀疑这是否会造成问题,因为在哪里用 @Transactional 注释它(propogation= PROPOGATION.REQUIRED)
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:81)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:73)
at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.checkRowCounts(BatchingBatch.java:151)
at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.performExecution(BatchingBatch.java:128)
at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.doExecuteBatch(BatchingBatch.java:111)
at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.execute(AbstractBatchImpl.java:163)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.executeBatch(JdbcCoordinatorImpl.java:226)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:482)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:349)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)
... 130 common frames omitted
Wrapped by: org.springframework.orm.ObjectOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:297)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:221)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:765)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:734)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:518)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy1125.createUserSession(Unknown Source)
解决方案
一旦它们都标记为 ,这两种方法都将在单个事务的范围内执行@Transactional
。
user
对象被加载到不同事务的边界或从缓存中获取,在某种情况下.finduserById()
使用一个。
确保您也标记了@Transactional
第二种.updateFewOtherDetails()
方法。
通过传播REQUIRED
,直到调用者序列结束,事务才会提交。
推荐阅读
- azure-cosmosdb - 在遍历中包含来自父顶点的特定边
- c# - 在现有的网络核心应用程序中使用托管服务
- angular - 如何通过firebase在Angular中单击列表项设置参考基础
- r - 查找向量中的值连续增加了多少次
- c# - 从对象列表,如何获取特定对象参数值的列表基于另一个参数值
- r - 从 GLM 生成漂亮的表格
- python - 这个特定代码的空间和时间复杂度是多少
- neo4j - distance() 函数返回的单位是什么?即米/英尺/英寸/公里/英里等,在 Neo4j 中使用 geoCode 是否不准确
- flutter - 在flutter中将数据从MySQL数据库填充到DropDown
- javascript - 如何格式化悬停下拉菜单,使其始终位于顶层?