diff options
author | unknown <heikki@hundin.mysql.fi> | 2002-11-07 15:05:26 +0200 |
---|---|---|
committer | unknown <heikki@hundin.mysql.fi> | 2002-11-07 15:05:26 +0200 |
commit | f5e71883bef3d89cb05fa9ab6497dbaed66ad9b0 (patch) | |
tree | b7d0117d6a1fa0e5669fe785b1e1ef4d25d62fde /innobase/row | |
parent | ec2df91657ed9042c706b3d0bd5f5574051ad3f7 (diff) | |
download | mariadb-git-f5e71883bef3d89cb05fa9ab6497dbaed66ad9b0.tar.gz |
row0mysql.c:
Backport from 4.0: Fix corruption of ON DELETE CASCADE in lock wait timeout
innobase/row/row0mysql.c:
Backport from 4.0: Fix corruption of ON DELETE CASCADE in lock wait timeout
Diffstat (limited to 'innobase/row')
-rw-r--r-- | innobase/row/row0mysql.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index 26878f8c97c..ebb3cbe8dc8 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -1000,8 +1000,8 @@ row_update_cascade_for_mysql( or set null operation */ dict_table_t* table) /* in: table where we do the operation */ { - ulint err; - trx_t* trx; + ulint err; + trx_t* trx; trx = thr_get_trx(thr); run_again: @@ -1012,11 +1012,26 @@ run_again: err = trx->error_state; + /* Note that the cascade node is a subnode of another InnoDB + query graph node. We do a normal lock wait in this node, but + all errors are handled by the parent node. */ + if (err == DB_LOCK_WAIT) { - que_thr_stop_for_mysql(thr); + /* Handle lock wait here */ - row_mysql_handle_errors(&err, trx, thr, NULL); + que_thr_stop_for_mysql(thr); + srv_suspend_mysql_thread(thr); + + /* Note that a lock wait may also end in a lock wait timeout */ + + if (trx->error_state != DB_SUCCESS) { + + return(trx->error_state); + } + + /* Retry operation after a normal lock wait */ + goto run_again; } |