summaryrefslogtreecommitdiff
path: root/innobase/lock
diff options
context:
space:
mode:
authorjan@hundin.mysql.fi <>2004-12-09 11:10:45 +0200
committerjan@hundin.mysql.fi <>2004-12-09 11:10:45 +0200
commitd6effde5d0d727d6f010314cdf422908bee10f98 (patch)
tree113b7055d0917544b26a20941cdfeccff09142ba /innobase/lock
parent835cf0f1e89761cdcca75135db86692674a60fac (diff)
downloadmariadb-git-d6effde5d0d727d6f010314cdf422908bee10f98.tar.gz
Added support for a LOCK TABLES...WHERE ENGINE = InnoDB query which sets
transactional table locks to tables mentioned in the query. These locks are released at the end of the transaction automatically. This is fix for bugs #5655, #5998 and issue #3762.
Diffstat (limited to 'innobase/lock')
-rw-r--r--innobase/lock/lock0lock.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/innobase/lock/lock0lock.c b/innobase/lock/lock0lock.c
index d2d16a1ae4e..1ff16bce45a 100644
--- a/innobase/lock/lock0lock.c
+++ b/innobase/lock/lock0lock.c
@@ -2207,7 +2207,8 @@ lock_grant(
release it at the end of the SQL statement */
lock->trx->auto_inc_lock = lock;
- } else if (lock_get_type(lock) == LOCK_TABLE_EXP) {
+ } else if (lock_get_type(lock) == LOCK_TABLE_EXP ||
+ lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) {
ut_a(lock_get_mode(lock) == LOCK_S
|| lock_get_mode(lock) == LOCK_X);
}
@@ -3421,6 +3422,10 @@ lock_table_create(
lock->trx->n_lock_table_exp++;
}
+ if (lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) {
+ lock->trx->n_lock_table_transactional++;
+ }
+
lock->un_member.tab_lock.table = table;
UT_LIST_ADD_LAST(un_member.tab_lock.locks, table->locks, lock);
@@ -3458,7 +3463,11 @@ lock_table_remove_low(
}
if (lock_get_type(lock) == LOCK_TABLE_EXP) {
- lock->trx->n_lock_table_exp--;
+ trx->n_lock_table_exp--;
+ }
+
+ if (lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) {
+ trx->n_lock_table_transactional--;
}
UT_LIST_REMOVE(trx_locks, trx->trx_locks, lock);
@@ -3592,7 +3601,8 @@ lock_table(
DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */
ulint flags, /* in: if BTR_NO_LOCKING_FLAG bit is set,
does nothing;
- if LOCK_TABLE_EXP bits are set,
+ if LOCK_TABLE_EXP|LOCK_TABLE_TRANSACTIONAL
+ bits are set,
creates an explicit table lock */
dict_table_t* table, /* in: database table in dictionary cache */
ulint mode, /* in: lock mode */
@@ -3608,7 +3618,8 @@ lock_table(
return(DB_SUCCESS);
}
- ut_a(flags == 0 || flags == LOCK_TABLE_EXP);
+ ut_a(flags == 0 || flags == LOCK_TABLE_EXP ||
+ flags == LOCK_TABLE_TRANSACTIONAL);
trx = thr_get_trx(thr);
@@ -3722,7 +3733,8 @@ lock_table_dequeue(
ut_ad(mutex_own(&kernel_mutex));
#endif /* UNIV_SYNC_DEBUG */
ut_a(lock_get_type(in_lock) == LOCK_TABLE ||
- lock_get_type(in_lock) == LOCK_TABLE_EXP);
+ lock_get_type(in_lock) == LOCK_TABLE_EXP ||
+ lock_get_type(in_lock) == LOCK_TABLE_TRANSACTIONAL);
lock = UT_LIST_GET_NEXT(un_member.tab_lock.locks, in_lock);
@@ -3826,7 +3838,9 @@ lock_release_off_kernel(
}
lock_table_dequeue(lock);
- if (lock_get_type(lock) == LOCK_TABLE_EXP) {
+
+ if (lock_get_type(lock) == LOCK_TABLE_EXP ||
+ lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) {
ut_a(lock_get_mode(lock) == LOCK_S
|| lock_get_mode(lock) == LOCK_X);
}
@@ -3850,6 +3864,7 @@ lock_release_off_kernel(
ut_a(trx->auto_inc_lock == NULL);
ut_a(trx->n_lock_table_exp == 0);
+ ut_a(trx->n_lock_table_transactional == 0);
}
/*************************************************************************
@@ -3915,6 +3930,7 @@ lock_release_tables_off_kernel(
}
ut_a(trx->n_lock_table_exp == 0);
+ ut_a(trx->n_lock_table_transactional == 0);
}
/*************************************************************************
@@ -4028,11 +4044,15 @@ lock_table_print(
ut_ad(mutex_own(&kernel_mutex));
#endif /* UNIV_SYNC_DEBUG */
ut_a(lock_get_type(lock) == LOCK_TABLE ||
- lock_get_type(lock) == LOCK_TABLE_EXP);
+ lock_get_type(lock) == LOCK_TABLE_EXP ||
+ lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL);
if (lock_get_type(lock) == LOCK_TABLE_EXP) {
fputs("EXPLICIT ", file);
+ } else if (lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) {
+ fputs("TRANSACTIONAL ", file);
}
+
fputs("TABLE LOCK table ", file);
ut_print_name(file, lock->trx, lock->un_member.tab_lock.table->name);
fprintf(file, " trx id %lu %lu",