Transactions Spring Propagation.REQUIRES_NEW@Transaction commit仅在outter事务结束后出现在日志中
我有一个相互调用的事务方法,但似乎事务在应该提交的点之后提交,或者至少在该点之后出现插入日志。以下是呼叫层次结构:Transactions Spring Propagation.REQUIRES_NEW@Transaction commit仅在outter事务结束后出现在日志中,transactions,transactionscope,spring-transactions,Transactions,Transactionscope,Spring Transactions,我有一个相互调用的事务方法,但似乎事务在应该提交的点之后提交,或者至少在该点之后出现插入日志。以下是呼叫层次结构: @Override @Transactional public DataProcessingStatistics copyInitialRevision() { try { DataProcessingStatistics statistics = new DataProcessingStatistics(); transaction(sta
@Override
@Transactional
public DataProcessingStatistics copyInitialRevision() {
try {
DataProcessingStatistics statistics = new DataProcessingStatistics();
transaction(statistics);
statistics.printResult();
return statistics;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void transaction(DataProcessingStatistics statistics) {
entityAuditTableService.generateTables(statistics);
oneToManyRelationAuditTableService.generateTables(statistics);
manyToManyRelationAuditTableService.generateTables(statistics);
}
...
@Service
public class EntityAuditTableServiceImpl implements EntityAuditTableService {
...
@Override
public void generateTables(DataProcessingStatistics statistics) {
List<EntityAuditTable> auditTables = loadAll();
for (EntityAuditTable auditTable : auditTables) {
try {
statistics.addAsProcessed(auditTable, process(auditTable));
} catch (Exception e) {
statistics.addAsSkipped(auditTable.getAuditTable(), e);
}
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public int process(EntityAuditTable auditTable) {
EntityDataTable table = entityDataTableService.create(auditTable.getEntityDataTable().getEntityClass());
List<EntityDataTableRow> rows = entityDataTableService.readAllData(table);
List<EntityAuditTableRow> auditTableRows = entityAuditTableRowService.generateTableData(auditTable, rows);
entityAuditTableRowService.saveAll(auditTableRows);
return auditTableRows.size();
}
...
@Service
public class EntityAuditTableRowServiceImpl implements EntityAuditTableRowService {
...
@Override
@Transactional
public void saveAll(List<EntityAuditTableRow> auditTableRows) {
jdbcService.saveArraysAs500RowChunks(auditTableRows, new ListSaver<EntityAuditTableRow>(){
@Override
public void save(List<EntityAuditTableRow> list) {
EntityAuditTableRowServiceImpl.this.saveJdbc(list);
for (EntityAuditTableRow auditTableRow: list) {
entityChangeService.saveFromRow(auditTableRow);
}
}
});
}
...
@Service
public class JdbcServiceImpl implements JdbcService {
@Override
public <E> void saveArraysAs500RowChunks(List<E> rows, ListSaver<E> saver) {
for (int i = 0; i < rows.size(); i += 500) {
save500(rows.subList(i, Math.min(i +500, rows.size())), saver);
}
}
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public <E> void save500(final List<E> rows, ListSaver<E> saver) {
if (rows == null || rows.size() == 0) {
return;
}
if (rows.size() > 500) {
throw new IllegalStateException("(auditTableRows.size() > 500)");
}
saver.save(rows);
}
...
@Service
public class EntityChangeServiceImpl implements EntityChangeService {
@Override
@Transactional
public void saveFromRow(EntityAuditTableRow auditTableRow) {
Revision revision = revisionsService.load(auditTableRow.getAuditTableRow().getRevision().getId());
EntityChange entityChange = create(auditTableRow);
save(entityChange);
revision.getEntitiesChanges().add(entityChange);
revisionsService.save(revision);
}
...
@Service
public class RevisionServiceImpl implements RevisionService {
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Revision create() {
Revision revisionEntity = createDetached();
long generateNextIdForClass = idService.generateNextIdForClass(Revision.class);
revisionEntity.setId(generateNextIdForClass);
revisionEntity.setTimestamp(new Date());
save(revisionEntity);
return revisionEntity;
}
@Override
@Transactional
public void save(Revision revisionEntity) {
persistenceManagerHibernate.save(revisionEntity);
}
此日志仅在返回后显示:
Hibernate: insert into ENTITY_CHANGED_IN_REVISION (ENTITY_ID, ENTITY_NAME, GROUP_ENTITY_ID, GROUP_NAME, REV_ID, REVISION_TYPE, ID) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into ENTITY_CHANGED_IN_REVISION (ENTITY_ID, ENTITY_NAME, GROUP_ENTITY_ID, GROUP_NAME, REV_ID, REVISION_TYPE, ID) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into ENTITY_CHANGED_IN_REVISION (ENTITY_ID, ENTITY_NAME, GROUP_ENTITY_ID, GROUP_NAME, REV_ID, REVISION_TYPE, ID) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into ENTITY_CHANGED_IN_REVISION (ENTITY_ID, ENTITY_NAME, GROUP_ENTITY_ID, GROUP_NAME, REV_ID, REVISION_TYPE, ID) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into ENTITY_CHANGED_IN_REVISION (ENTITY_ID, ENTITY_NAME, GROUP_ENTITY_ID, GROUP_NAME, REV_ID, REVISION_TYPE, ID) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into ENTITY_CHANGED_IN_REVISION (ENTITY_ID, ENTITY_NAME, GROUP_ENTITY_ID, GROUP_NAME, REV_ID, REVISION_TYPE, ID) values (?, ?, ?, ?, ?, ?, ?)
而不是在从@Transactional(传播=传播。需要_NEW)的“保存500行块”方法返回后重新显示它们:
@覆盖
@事务性(传播=传播。需要\u新建)
public void save500(最终列表行,ListSaver){
if(rows==null | | rows.size()==0){
返回;
}
如果(rows.size()>500){
抛出新的IllegalStateException(((auditTableRows.size()>500)”;
}
saver.save(行);//调用EntityChangeServiceImpl.saveFromRow
}
...
@服务
公共类EntityChangeServiceImpl实现EntityChangeService{
@凌驾
@交易的
public void saveFromRow(EntityAuditTableRow auditTableRow){
Revision Revision=RevisionService.load(auditTableRow.getAuditTableRow().getRevision().getId());
EntityChange EntityChange=创建(auditTableRow);
保存(实体更改);
revision.getEntityChanges().add(entityChange);
修订服务保存(修订);
}
要应用@Transactional
并打开它,必须通过代理执行类的事务方法调用该类的其他事务方法,而不使用代理,因此在调用中不使用第二个方法transaction
Hibernate: insert into ENTITY_CHANGED_IN_REVISION (ENTITY_ID, ENTITY_NAME, GROUP_ENTITY_ID, GROUP_NAME, REV_ID, REVISION_TYPE, ID) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into ENTITY_CHANGED_IN_REVISION (ENTITY_ID, ENTITY_NAME, GROUP_ENTITY_ID, GROUP_NAME, REV_ID, REVISION_TYPE, ID) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into ENTITY_CHANGED_IN_REVISION (ENTITY_ID, ENTITY_NAME, GROUP_ENTITY_ID, GROUP_NAME, REV_ID, REVISION_TYPE, ID) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into ENTITY_CHANGED_IN_REVISION (ENTITY_ID, ENTITY_NAME, GROUP_ENTITY_ID, GROUP_NAME, REV_ID, REVISION_TYPE, ID) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into ENTITY_CHANGED_IN_REVISION (ENTITY_ID, ENTITY_NAME, GROUP_ENTITY_ID, GROUP_NAME, REV_ID, REVISION_TYPE, ID) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into ENTITY_CHANGED_IN_REVISION (ENTITY_ID, ENTITY_NAME, GROUP_ENTITY_ID, GROUP_NAME, REV_ID, REVISION_TYPE, ID) values (?, ?, ?, ?, ?, ?, ?)
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public <E> void save500(final List<E> rows, ListSaver<E> saver) {
if (rows == null || rows.size() == 0) {
return;
}
if (rows.size() > 500) {
throw new IllegalStateException("(auditTableRows.size() > 500)");
}
saver.save(rows); // invokes EntityChangeServiceImpl.saveFromRow
}
...
@Service
public class EntityChangeServiceImpl implements EntityChangeService {
@Override
@Transactional
public void saveFromRow(EntityAuditTableRow auditTableRow) {
Revision revision = revisionsService.load(auditTableRow.getAuditTableRow().getRevision().getId());
EntityChange entityChange = create(auditTableRow);
save(entityChange);
revision.getEntitiesChanges().add(entityChange);
revisionsService.save(revision);
}