FIX: Put the delete statements into the correct flush-queue, so they do not conflict with the following inserts

This commit is contained in:
Jonas Pöhler
2023-06-16 16:26:14 +02:00
parent 09f616aae8
commit b63445e9c9
7 changed files with 14 additions and 11 deletions
@@ -101,7 +101,7 @@ public interface Persister {
/**
* Execute or queue the update.
*/
void executeOrQueue(SpiSqlUpdate update, SpiTransaction t, boolean queue);
void executeOrQueue(SpiSqlUpdate update, SpiTransaction t, boolean queue, int queuePosition);
/**
* Queue the SqlUpdate for execution with position 0, 1 or 2 defining
@@ -83,6 +83,9 @@ public final class BatchControl {
private final Queue[] queues = new Queue[3];
static final int DELETE_QUEUE = 1;
static final int INSERT_QUEUE = 2;
/**
* Create for a given transaction, PersistExecute, default size and getGeneratedKeys.
*/
@@ -267,8 +270,8 @@ public final class BatchControl {
private void flushBuffer(boolean reset) throws BatchedSqlException {
flushQueue(queues[0]);
flushInternal(reset);
flushQueue(queues[1]);
flushQueue(queues[2]);
flushQueue(queues[DELETE_QUEUE]);
flushQueue(queues[INSERT_QUEUE]);
}
private void flushQueue(Queue queue) throws BatchedSqlException {
@@ -106,9 +106,9 @@ public final class DefaultPersister implements Persister {
}
@Override
public void executeOrQueue(SpiSqlUpdate update, SpiTransaction t, boolean queue) {
public void executeOrQueue(SpiSqlUpdate update, SpiTransaction t, boolean queue, int queuePosition) {
if (queue) {
addToFlushQueue(update, t, 2);
addToFlushQueue(update, t, queuePosition);
} else {
executeSqlUpdate(update, t);
}
@@ -907,7 +907,7 @@ public final class DefaultPersister implements Persister {
void deleteManyIntersection(EntityBean bean, BeanPropertyAssocMany<?> many, SpiTransaction t, boolean publish, boolean queue) {
SpiSqlUpdate sqlDelete = deleteAllIntersection(bean, many, publish);
if (queue) {
addToFlushQueue(sqlDelete, t, 1);
addToFlushQueue(sqlDelete, t, BatchControl.DELETE_QUEUE);
} else {
executeSqlUpdate(sqlDelete, t);
}
@@ -48,7 +48,7 @@ abstract class SaveManyBase implements SaveMany {
final void preElementCollectionUpdate() {
if (!insertedParent) {
request.preElementCollectionUpdate();
persister.addToFlushQueue(many.deleteByParentId(request.beanId(), null), transaction, 1);
persister.addToFlushQueue(many.deleteByParentId(request.beanId(), null), transaction, BatchControl.DELETE_QUEUE);
}
}
@@ -294,7 +294,7 @@ final class SaveManyBeans extends SaveManyBase {
// build a intersection row for 'delete'
IntersectionRow intRow = many.buildManyToManyMapBean(parentBean, otherDelete, publish);
SpiSqlUpdate sqlDelete = intRow.createDelete(server, DeleteMode.HARD);
persister.executeOrQueue(sqlDelete, transaction, queue);
persister.executeOrQueue(sqlDelete, transaction, queue, BatchControl.DELETE_QUEUE);
}
}
if (additions != null && !additions.isEmpty()) {
@@ -314,7 +314,7 @@ final class SaveManyBeans extends SaveManyBase {
// build a intersection row for 'insert'
IntersectionRow intRow = many.buildManyToManyMapBean(parentBean, otherBean, publish);
SpiSqlUpdate sqlInsert = intRow.createInsert(server);
persister.executeOrQueue(sqlInsert, transaction, queue);
persister.executeOrQueue(sqlInsert, transaction, queue, BatchControl.INSERT_QUEUE);
}
}
}
@@ -48,7 +48,7 @@ final class SaveManyElementCollection extends SaveManyBase {
final SpiSqlUpdate sqlInsert = proto.copy();
sqlInsert.setParameter(parentId);
many.bindElementValue(sqlInsert, value);
persister.addToFlushQueue(sqlInsert, transaction, 2);
persister.addToFlushQueue(sqlInsert, transaction, BatchControl.INSERT_QUEUE);
}
resetModifyState();
postElementCollectionUpdate();
@@ -51,7 +51,7 @@ final class SaveManyElementCollectionMap extends SaveManyBase {
sqlInsert.setParameter(parentId);
sqlInsert.setParameter(entry.getKey());
many.bindElementValue(sqlInsert, entry.getValue());
persister.addToFlushQueue(sqlInsert, transaction, 2);
persister.addToFlushQueue(sqlInsert, transaction, BatchControl.INSERT_QUEUE);
}
resetModifyState();
postElementCollectionUpdate();