1111import java .sql .Connection ;
1212import java .sql .SQLException ;
1313import java .util .*;
14+ import java .util .concurrent .locks .Lock ;
15+ import java .util .concurrent .locks .ReentrantLock ;
1416import java .util .stream .Collectors ;
1517
1618public abstract class SqlStorageSupplier implements DataStorageSupplier {
1719 protected final Logger logger = LoggerProvider .getLogger (getClass ());
20+ private final Lock lock = new ReentrantLock ();
1821
1922 protected abstract Connection getConnection () throws SQLException ;
2023
2124 protected abstract void flushConnection (Connection connection );
2225
26+ protected boolean shouldLockWhenModify () {
27+ return false ;
28+ }
29+
2330 protected abstract List <String > toSaveStatement (String name , String [] keyColumns , String [] valueColumns );
2431
2532 protected abstract List <Object []> toSaveValues (Object [] keys , Object [] values );
@@ -86,6 +93,9 @@ public Optional<V> load(K key) {
8693
8794 @ Override
8895 public Optional <Modifier <K , V >> modify () {
96+ if (shouldLockWhenModify ()) {
97+ lock .lock ();
98+ }
8999 try {
90100 Connection connection = getConnection ();
91101 Modifier <K , V > modifier = new Modifier <K , V >() {
@@ -144,6 +154,9 @@ public void commit() {
144154 logger .log (LogLevel .ERROR , "Failed to commit" , e );
145155 } finally {
146156 flushConnection (connection );
157+ if (shouldLockWhenModify ()) {
158+ lock .unlock ();
159+ }
147160 }
148161 }
149162
@@ -155,6 +168,9 @@ public void rollback() {
155168 logger .log (LogLevel .ERROR , "Failed to rollback" , e );
156169 } finally {
157170 flushConnection (connection );
171+ if (shouldLockWhenModify ()) {
172+ lock .unlock ();
173+ }
158174 }
159175 }
160176 };
0 commit comments