From c17c9620efb0c7b4fe7efbe747bc918310771bbc Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 15 Nov 2002 22:59:16 +0200 Subject: ha_innodb.cc: Fix another bug introduced in 4.0.4 in AUTO_INCREMENT and deadlock or lock wait timeout sql/ha_innodb.cc: Fix another bug introduced in 4.0.4 in AUTO_INCREMENT and deadlock or lock wait timeout --- sql/ha_innodb.cc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'sql') diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index d473d27e1fc..46ddeb2c027 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -1800,6 +1800,8 @@ ha_innobase::write_row( goto func_exit; } + printf("Updated value to %lu + 1\n", (ulint)auto_inc); + dict_table_autoinc_update(prebuilt->table, auto_inc); } else { srv_conc_enter_innodb(prebuilt->trx); @@ -1865,8 +1867,12 @@ ha_innobase::write_row( introduced only in version 4.0.4. NOTE that a REPLACE command handles a duplicate key error itself, and we must not decrement the autoinc counter - if we are performing a REPLACE statement. This was fixed - in 4.0.6. */ + if we are performing a REPLACE statement. + NOTE 2: if there was an error, for example a deadlock, + which caused InnoDB to roll back the whole transaction + already in the call of row_insert_for_mysql(), we may no + longer have the AUTO-INC lock, and cannot decrement + the counter here. */ skip_auto_inc_decr = FALSE; @@ -1876,11 +1882,13 @@ ha_innobase::write_row( &skip_auto_inc_decr); } - if (!skip_auto_inc_decr && incremented_auto_inc_counter) { + if (!skip_auto_inc_decr && incremented_auto_inc_counter + && prebuilt->trx->auto_inc_lock) { dict_table_autoinc_decrement(prebuilt->table); } - if (!skip_auto_inc_decr && incremented_auto_inc_for_stat) { + if (!skip_auto_inc_decr && incremented_auto_inc_for_stat + && prebuilt->trx->auto_inc_lock) { auto_inc_counter_for_this_stat--; } } -- cgit v1.2.1