Reorder SQL to avoid race conditions (Liquibase #8) 00/141500/3
authordanielhanrahan <daniel.hanrahan@est.tech>
Thu, 24 Jul 2025 12:50:06 +0000 (13:50 +0100)
committerdanielhanrahan <daniel.hanrahan@est.tech>
Wed, 30 Jul 2025 09:27:52 +0000 (10:27 +0100)
This commit rearranges SQL statements to minimize race conditions
once the SQL is converted to seperate Liquibase steps.

When adding default values & not-null constraints, do it like this:
1. Set default value for the column, so any new data will not be NULL
2. Update any existing NULLs to that same default value
3. Add the NOT NULL constraint to the column

If DEFAULT is set after NOT NULL, it's possible new rows could be
added with NULL, causing the SET NOT NULL to fail.

Issue-ID: POLICY-5398
Change-Id: Ia9b10340fbd6a856d5e4b2aa059f0c8d59a2f070
Signed-off-by: danielhanrahan <daniel.hanrahan@est.tech>
runtime-acm/src/main/resources/db/changelog/changelog-1701.yaml

index 1dcc25c..1b06f23 100644 (file)
@@ -43,24 +43,29 @@ databaseChangeLog:
       changes:
         - sql:
             sql: |
-              UPDATE automationcomposition SET deployState = 2 WHERE deployState IS NULL;
-              UPDATE automationcomposition SET lockState = 4 WHERE lockState IS NULL;
-              UPDATE automationcomposition SET name = '' WHERE name IS NULL;
-              UPDATE automationcomposition SET version = '1.0.0' WHERE version IS NULL;
-              UPDATE automationcomposition SET lastMsg = now() WHERE lastMsg IS NULL;
-              UPDATE automationcomposition SET subState = 0 WHERE subState IS NULL;
-
               ALTER TABLE automationcomposition ALTER COLUMN compositionid SET NOT NULL;
+
               ALTER TABLE automationcomposition ALTER COLUMN name SET DEFAULT '';
+              UPDATE automationcomposition SET name = '' WHERE name IS NULL;
               ALTER TABLE automationcomposition ALTER COLUMN name SET NOT NULL;
+
               ALTER TABLE automationcomposition ALTER COLUMN version SET DEFAULT '1.0.0';
+              UPDATE automationcomposition SET version = '1.0.0' WHERE version IS NULL;
               ALTER TABLE automationcomposition ALTER COLUMN version SET NOT NULL;
+
               ALTER TABLE automationcomposition ALTER COLUMN deployState SET DEFAULT 2;
+              UPDATE automationcomposition SET deployState = 2 WHERE deployState IS NULL;
               ALTER TABLE automationcomposition ALTER COLUMN deployState SET NOT NULL;
+
               ALTER TABLE automationcomposition ALTER COLUMN lockState SET DEFAULT 4;
+              UPDATE automationcomposition SET lockState = 4 WHERE lockState IS NULL;
               ALTER TABLE automationcomposition ALTER COLUMN lockState SET NOT NULL;
+
               ALTER TABLE automationcomposition ALTER COLUMN SubState SET DEFAULT 0;
+              UPDATE automationcomposition SET subState = 0 WHERE subState IS NULL;
               ALTER TABLE automationcomposition ALTER COLUMN SubState SET NOT NULL;
+
+              UPDATE automationcomposition SET lastMsg = now() WHERE lastMsg IS NULL;
               ALTER TABLE automationcomposition ALTER COLUMN lastMsg SET NOT NULL;
 
   - changeSet:
@@ -69,26 +74,31 @@ databaseChangeLog:
       changes:
         - sql:
             sql: |
+              ALTER TABLE automationcompositionelement ALTER COLUMN definition_name SET DEFAULT '';
               UPDATE automationcompositionelement SET definition_name = '' WHERE definition_name IS NULL;
-              UPDATE automationcompositionelement SET definition_version = '0.0.0' WHERE definition_version IS NULL;
-              UPDATE automationcompositionelement SET deploystate = 2 WHERE deploystate IS NULL;
-              UPDATE automationcompositionelement SET lockState = 4 WHERE lockState IS NULL;
-              UPDATE automationcompositionelement SET subState = 0 WHERE subState IS NULL;
-
               ALTER TABLE automationcompositionelement ALTER COLUMN definition_name SET NOT NULL;
-              ALTER TABLE automationcompositionelement ALTER COLUMN definition_name SET DEFAULT '';
-              ALTER TABLE automationcompositionelement ALTER COLUMN definition_version SET NOT NULL;
+
               ALTER TABLE automationcompositionelement ALTER COLUMN definition_version SET DEFAULT '0.0.0';
-              ALTER TABLE automationcompositionelement ALTER COLUMN deploystate SET NOT NULL;
+              UPDATE automationcompositionelement SET definition_version = '0.0.0' WHERE definition_version IS NULL;
+              ALTER TABLE automationcompositionelement ALTER COLUMN definition_version SET NOT NULL;
+
               ALTER TABLE automationcompositionelement ALTER COLUMN deployState SET DEFAULT 2;
-              ALTER TABLE automationcompositionelement ALTER COLUMN lockState SET NOT NULL;
+              UPDATE automationcompositionelement SET deploystate = 2 WHERE deploystate IS NULL;
+              ALTER TABLE automationcompositionelement ALTER COLUMN deploystate SET NOT NULL;
+
               ALTER TABLE automationcompositionelement ALTER COLUMN lockState SET DEFAULT 4;
-              ALTER TABLE automationcompositionelement ALTER COLUMN substate SET NOT NULL;
+              UPDATE automationcompositionelement SET lockState = 4 WHERE lockState IS NULL;
+              ALTER TABLE automationcompositionelement ALTER COLUMN lockState SET NOT NULL;
+
               ALTER TABLE automationcompositionelement ALTER COLUMN substate SET DEFAULT 0;
-              ALTER TABLE automationcompositionelement ALTER COLUMN outproperties SET NOT NULL;
+              UPDATE automationcompositionelement SET subState = 0 WHERE subState IS NULL;
+              ALTER TABLE automationcompositionelement ALTER COLUMN substate SET NOT NULL;
+
               ALTER TABLE automationcompositionelement ALTER COLUMN outproperties SET DEFAULT '{}';
-              ALTER TABLE automationcompositionelement ALTER COLUMN properties SET NOT NULL;
+              ALTER TABLE automationcompositionelement ALTER COLUMN outproperties SET NOT NULL;
+
               ALTER TABLE automationcompositionelement ALTER COLUMN properties SET DEFAULT '{}';
+              ALTER TABLE automationcompositionelement ALTER COLUMN properties SET NOT NULL;
 
   - changeSet:
       id: 1701-4
@@ -115,20 +125,23 @@ databaseChangeLog:
       changes:
         - sql:
             sql: |
+              ALTER TABLE automationcompositiondefinition ALTER COLUMN name SET DEFAULT '';
               UPDATE automationcompositiondefinition SET name = '' WHERE name IS NULL;
-              UPDATE automationcompositiondefinition SET version  = '1.0.0' WHERE version IS NULL;
-              UPDATE automationcompositiondefinition SET state  = 0 WHERE state IS NULL;
-              UPDATE automationcompositiondefinition SET lastMsg = now() WHERE lastMsg IS NULL;
-              UPDATE automationcompositiondefinition SET serviceTemplate = '' WHERE serviceTemplate IS NULL;
-
               ALTER TABLE automationcompositiondefinition ALTER COLUMN name SET NOT NULL;
-              ALTER TABLE automationcompositiondefinition ALTER COLUMN name SET DEFAULT '';
-              ALTER TABLE automationcompositiondefinition ALTER COLUMN version SET NOT NULL;
+
               ALTER TABLE automationcompositiondefinition ALTER COLUMN version SET DEFAULT '1.0.0';
-              ALTER TABLE automationcompositiondefinition ALTER COLUMN state SET NOT NULL;
+              UPDATE automationcompositiondefinition SET version  = '1.0.0' WHERE version IS NULL;
+              ALTER TABLE automationcompositiondefinition ALTER COLUMN version SET NOT NULL;
+
               ALTER TABLE automationcompositiondefinition ALTER COLUMN state SET DEFAULT 0;
-              ALTER TABLE automationcompositiondefinition ALTER COLUMN serviceTemplate SET NOT NULL;
+              UPDATE automationcompositiondefinition SET state = 0 WHERE state IS NULL;
+              ALTER TABLE automationcompositiondefinition ALTER COLUMN state SET NOT NULL;
+
               ALTER TABLE automationcompositiondefinition ALTER COLUMN serviceTemplate SET DEFAULT '';
+              UPDATE automationcompositiondefinition SET serviceTemplate = '' WHERE serviceTemplate IS NULL;
+              ALTER TABLE automationcompositiondefinition ALTER COLUMN serviceTemplate SET NOT NULL;
+
+              UPDATE automationcompositiondefinition SET lastMsg = now() WHERE lastMsg IS NULL;
               ALTER TABLE automationcompositiondefinition ALTER COLUMN lastMsg SET NOT NULL;
 
   - changeSet:
@@ -137,19 +150,21 @@ databaseChangeLog:
       changes:
         - sql:
             sql: |
+              ALTER TABLE nodetemplatestate ALTER COLUMN nodeTemplate_name SET DEFAULT '';
               UPDATE nodetemplatestate SET nodeTemplate_name  = '' WHERE nodeTemplate_name IS NULL;
-              UPDATE nodetemplatestate SET nodeTemplate_version = '1.0.0' WHERE nodeTemplate_version IS NULL;
-              UPDATE nodetemplatestate SET outProperties = '{}' WHERE outProperties IS NULL;
-              UPDATE nodetemplatestate SET state = 0 WHERE state IS NULL;
-
               ALTER TABLE nodetemplatestate ALTER COLUMN nodeTemplate_name SET NOT NULL;
-              ALTER TABLE nodetemplatestate ALTER COLUMN nodeTemplate_name SET DEFAULT '';
-              ALTER TABLE nodetemplatestate ALTER COLUMN nodeTemplate_version SET NOT NULL;
+
               ALTER TABLE nodetemplatestate ALTER COLUMN nodeTemplate_version SET DEFAULT '1.0.0';
-              ALTER TABLE nodetemplatestate ALTER COLUMN outProperties SET NOT NULL;
+              UPDATE nodetemplatestate SET nodeTemplate_version = '1.0.0' WHERE nodeTemplate_version IS NULL;
+              ALTER TABLE nodetemplatestate ALTER COLUMN nodeTemplate_version SET NOT NULL;
+
               ALTER TABLE nodetemplatestate ALTER COLUMN outProperties SET DEFAULT '{}';
-              ALTER TABLE nodetemplatestate ALTER COLUMN state SET NOT NULL;
+              UPDATE nodetemplatestate SET outProperties = '{}' WHERE outProperties IS NULL;
+              ALTER TABLE nodetemplatestate ALTER COLUMN outProperties SET NOT NULL;
+
               ALTER TABLE nodetemplatestate ALTER COLUMN state SET DEFAULT 0;
+              UPDATE nodetemplatestate SET state = 0 WHERE state IS NULL;
+              ALTER TABLE nodetemplatestate ALTER COLUMN state SET NOT NULL;
 
   - changeSet:
       id: 1701-7
@@ -170,13 +185,14 @@ databaseChangeLog:
         - sql:
             sql: |
               UPDATE participantreplica SET lastMsg = now() WHERE lastMsg IS NULL;
-              UPDATE participantreplica SET participantState = '1' WHERE participantState IS NULL;
-
               ALTER TABLE participantreplica ALTER COLUMN lastMsg SET NOT NULL;
-              ALTER TABLE participantreplica ALTER COLUMN participantId SET NOT NULL;
+
               ALTER TABLE participantreplica ALTER COLUMN participantId SET DEFAULT '';
-              ALTER TABLE participantreplica ALTER COLUMN participantState SET NOT NULL;
+              ALTER TABLE participantreplica ALTER COLUMN participantId SET NOT NULL;
+
               ALTER TABLE participantreplica ALTER COLUMN participantState SET DEFAULT 1;
+              UPDATE participantreplica SET participantState = '1' WHERE participantState IS NULL;
+              ALTER TABLE participantreplica ALTER COLUMN participantState SET NOT NULL;
 
   - changeSet:
       id: 1701-9
@@ -184,12 +200,13 @@ databaseChangeLog:
       changes:
         - sql:
             sql: |
-              UPDATE participantsupportedacelements SET typeName = '' WHERE typeName IS NULL;
-              UPDATE participantsupportedacelements SET typeVersion = '1.0.0' WHERE typeVersion IS NULL;
-
-              ALTER TABLE participantsupportedacelements ALTER COLUMN participantId SET NOT NULL;
               ALTER TABLE participantsupportedacelements ALTER COLUMN participantId SET DEFAULT '';
-              ALTER TABLE participantsupportedacelements ALTER COLUMN typeName SET NOT NULL;
+              ALTER TABLE participantsupportedacelements ALTER COLUMN participantId SET NOT NULL;
+
               ALTER TABLE participantsupportedacelements ALTER COLUMN typeName SET DEFAULT '';
-              ALTER TABLE participantsupportedacelements ALTER COLUMN typeVersion SET NOT NULL;
+              UPDATE participantsupportedacelements SET typeName = '' WHERE typeName IS NULL;
+              ALTER TABLE participantsupportedacelements ALTER COLUMN typeName SET NOT NULL;
+
               ALTER TABLE participantsupportedacelements ALTER COLUMN typeVersion SET DEFAULT '1.0.0';
+              UPDATE participantsupportedacelements SET typeVersion = '1.0.0' WHERE typeVersion IS NULL;
+              ALTER TABLE participantsupportedacelements ALTER COLUMN typeVersion SET NOT NULL;