summaryrefslogtreecommitdiff
path: root/innobase
diff options
context:
space:
mode:
authorjan@hundin.mysql.fi <>2004-08-17 09:45:54 +0300
committerjan@hundin.mysql.fi <>2004-08-17 09:45:54 +0300
commit656a376285678fb20fe3df4c66803133325d40db (patch)
treef2bc7d98eb6e547e3e0c79fdf19b3b64143d39b3 /innobase
parent2b5a657a3d7fd86249f58d02b77dd07df9321438 (diff)
downloadmariadb-git-656a376285678fb20fe3df4c66803133325d40db.tar.gz
Relaxed lock wait rules so that record lock does not need to wait for a
gap type lock.
Diffstat (limited to 'innobase')
-rw-r--r--innobase/lock/lock0lock.c19
-rw-r--r--innobase/row/row0ins.c47
2 files changed, 37 insertions, 29 deletions
diff --git a/innobase/lock/lock0lock.c b/innobase/lock/lock0lock.c
index 2d326f7392f..0f2784e00bc 100644
--- a/innobase/lock/lock0lock.c
+++ b/innobase/lock/lock0lock.c
@@ -773,19 +773,22 @@ lock_rec_has_to_wait(
/* We have somewhat complex rules when gap type record locks
cause waits */
- if (( lock_is_on_supremum || (type_mode & LOCK_GAP))
+ if ((lock_is_on_supremum || (type_mode & LOCK_GAP))
&& !(type_mode & LOCK_INSERT_INTENTION)) {
+
/* Gap type locks without LOCK_INSERT_INTENTION flag
- do not need to wait for anything. This is because different
- users can have conflicting lock types on gaps. */
+ do not need to wait for anything. This is because
+ different users can have conflicting lock types
+ on gaps. */
return(FALSE);
}
- if ((type_mode & LOCK_REC_NOT_GAP)
+ if (!(type_mode & LOCK_INSERT_INTENTION)
&& lock_rec_get_gap(lock2)) {
- /* Lock on just the record does not need to wait for
- a gap type lock */
+
+ /* Record lock (LOCK_ORDINARY or LOCK_REC_NOT_GAP
+ does not need to wait for a gap type lock */
return(FALSE);
}
@@ -846,8 +849,8 @@ lock_has_to_wait(
then the second bit on the lock bitmap is set */
return(lock_rec_has_to_wait(lock1->trx,
- lock1->type_mode, lock2,
- lock_rec_get_nth_bit(lock1,1)));
+ lock1->type_mode, lock2,
+ lock_rec_get_nth_bit(lock1,1)));
}
return(TRUE);
diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c
index 611ffbcffca..edd3099b5f3 100644
--- a/innobase/row/row0ins.c
+++ b/innobase/row/row0ins.c
@@ -1635,21 +1635,24 @@ row_ins_duplicate_error_in_clust(
sure that in roll-forward we get the same duplicate
errors as in original execution */
- dict_accept(*trx->mysql_query_str, "REPLACE", &success);
+ dict_accept(*trx->mysql_query_str, "REPLACE",
+ &success);
if (success) {
- /* The manual defines the REPLACE semantics that it
- is either an INSERT or DELETE(s) for duplicate key
- + INSERT. Therefore, we should take X-lock for
- duplicates */
+ /* The manual defines the REPLACE semantics
+ that it is either an INSERT or DELETE(s)
+ for duplicate key + INSERT. Therefore, we
+ should take X-lock for duplicates */
err = row_ins_set_exclusive_rec_lock(
- LOCK_REC_NOT_GAP,rec,cursor->index,thr);
+ LOCK_REC_NOT_GAP,rec,cursor->index,
+ thr);
} else {
err = row_ins_set_shared_rec_lock(
- LOCK_REC_NOT_GAP,rec, cursor->index, thr);
+ LOCK_REC_NOT_GAP,rec, cursor->index,
+ thr);
}
if (err != DB_SUCCESS) {
@@ -1673,26 +1676,28 @@ row_ins_duplicate_error_in_clust(
if (rec != page_get_supremum_rec(page)) {
- /* The manual defines the REPLACE semantics that it
- is either an INSERT or DELETE(s) for duplicate key
- + INSERT. Therefore, we should take X-lock for
- duplicates.
+ /* The manual defines the REPLACE semantics that it
+ is either an INSERT or DELETE(s) for duplicate key
+ + INSERT. Therefore, we should take X-lock for
+ duplicates.
*/
-
- /* Is the first word in MySQL query REPLACE ? */
+ /* Is the first word in MySQL query REPLACE ? */
- dict_accept(*trx->mysql_query_str, "REPLACE", &success);
+ dict_accept(*trx->mysql_query_str, "REPLACE",
+ &success);
- if (success) {
+ if (success) {
- err = row_ins_set_exclusive_rec_lock(
- LOCK_REC_NOT_GAP,rec,cursor->index,thr);
- } else {
+ err = row_ins_set_exclusive_rec_lock(
+ LOCK_REC_NOT_GAP,
+ rec,cursor->index,thr);
+ } else {
- err = row_ins_set_shared_rec_lock(
- LOCK_REC_NOT_GAP,rec, cursor->index, thr);
- }
+ err = row_ins_set_shared_rec_lock(
+ LOCK_REC_NOT_GAP,rec,
+ cursor->index, thr);
+ }
if (err != DB_SUCCESS) {