From 41f07dc4526e27f5363284c93b765eb08f19254c Mon Sep 17 00:00:00 2001 From: delvh Date: Tue, 22 Sep 2020 17:02:50 +0200 Subject: [PATCH] Fixed Transactions not Getting Closed on the Server (#42) Fixes #16 Reviewed-on: https://git.kske.dev/zdm/envoy/pulls/42 Reviewed-by: kske --- .../envoy/server/data/PersistenceManager.java | 53 ++++++++++++++----- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/server/src/main/java/envoy/server/data/PersistenceManager.java b/server/src/main/java/envoy/server/data/PersistenceManager.java index a9915e8..fbadbb9 100755 --- a/server/src/main/java/envoy/server/data/PersistenceManager.java +++ b/server/src/main/java/envoy/server/data/PersistenceManager.java @@ -3,9 +3,7 @@ package envoy.server.data; import java.time.Instant; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; -import javax.persistence.Persistence; +import javax.persistence.*; import envoy.data.User.UserStatus; import envoy.server.net.ConnectionManager; @@ -235,8 +233,8 @@ public final class PersistenceManager { public void addContactBidirectional(long contactID1, long contactID2) { // Get users by ID - Contact c1 = getContactByID(contactID1); - Contact c2 = getContactByID(contactID2); + final var c1 = getContactByID(contactID1); + final var c2 = getContactByID(contactID2); // Add users to each others contact lists c1.getContacts().add(c2); @@ -259,20 +257,47 @@ public final class PersistenceManager { } private void persist(Object obj) { - transaction.begin(); - entityManager.persist(obj); - transaction.commit(); + try { + transaction.begin(); + entityManager.persist(obj); + transaction.commit(); + + // Last transaction threw an error resulting in the transaction not being closed + } catch (final IllegalStateException e) { + if (transaction.isActive()) { + transaction.rollback(); + persist(obj); + } + } } private void merge(Object obj) { - transaction.begin(); - entityManager.merge(obj); - transaction.commit(); + try { + transaction.begin(); + entityManager.merge(obj); + transaction.commit(); + + // Last transaction threw an error resulting in the transaction not being closed + } catch (final IllegalStateException e) { + if (transaction.isActive()) { + transaction.rollback(); + merge(obj); + } + } } private void remove(Object obj) { - transaction.begin(); - entityManager.remove(obj); - transaction.commit(); + try { + transaction.begin(); + entityManager.remove(obj); + transaction.commit(); + + // Last transaction threw an error resulting in the transaction not being closed + } catch (final IllegalStateException e) { + if (transaction.isActive()) { + transaction.rollback(); + remove(obj); + } + } } }