>>>>> On Fri, 15 Jan 2021 14:18:32 -0500, Phil Stracchino said:
> 
> The proper way to fix this is as follows:
> 
> INSERT IGNORE into the table.
> If mysql_affected_rows() returns 1, i.e we inserted exactly one row;
> return mysql_insert_id(), which will be correct.
> If mysql_affected_rows() returns 0, then the INSERT was ignored because
> the Path already exists.  In this case mysql_insert_id() will be wrong,
> so return SELECT PathId FROM Path WHERE Path = 'the path we just tried
> to insert but found it already existed'.
> 
> This should return the correct PathId in all cases, whether it is a
> newly inserted row or the previously existing row, UNLESS the INSERT
> failed for some *other* reason than the Path already existing, in which
> case we *should legitimately* fail.  (Possibly after retrying.)

Looks reasonable to me.  (*)

If the INSERT failed for some other reason then the original mysql_query()
should have failed rather than mysql_affected_rows() returning 0.  I think if
a subsequent SELECT returns a PathId then it would be safe to assume it is
correct, regardless of any error in the INSERT.

(*) Except that there is the still an outstanding mystery about why this only
seems to happen repeatably for you and I think someone asked for more
debugging info about why you have concurrent updates to the db at all.

__Martin


_______________________________________________
Bacula-devel mailing list
Bacula-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bacula-devel

Reply via email to