Log Message: |
Avoid database deadlocks that can happen when database clients try
to work with the same case using two separate database
connections. See mpuls/issue1145 for details.
* formed/formed/plugins/export/rg_sql.py (SQL_TEMPLATE): Split the
computation of the new json structure description into the new
database function compute_case_structure
(TRIGGER_TMPL): Change the trigger functions to immediately update
the cached json structure description instead of just setting the
modified flag. This avoids the lazy recomputation that makes what
seems like a read-only access (calling get_case_structure) into a
writing access (updates of the cache). The writes lock the row in
the case_structure table which prevent other connections from
accessing the same case. As part of this, the delete triggers are
now AFTER triggers because the repeat groups instance must have
been removed when the structure is recomputed.
(SUBSELECT_TMPL): Since the delete trigger is now an after
trigger, we need to change the way the master id is computed. We
cannot join with the repeatgroup table in question because the row
has already been deleted. However, we can use the master_id
column of the OLD row to select the row of the parent table.
(create_triggers): Avoid the inner joins with the current repeat
group for the above mentioned reasons. In the very common case of
repeat groups which are direct children of the master_tbl, we can
compare the master_tbl.id directly with the row's master_id.
|