Commit d12c3540 authored by jan@hundin.mysql.fi's avatar jan@hundin.mysql.fi

Fixed BUG #6747: innodb_locks_unsafe_for_binlog still uses next-key locking.

parent e3b94d4e
...@@ -638,23 +638,24 @@ row_sel_get_clust_rec( ...@@ -638,23 +638,24 @@ row_sel_get_clust_rec(
if (!node->read_view) { if (!node->read_view) {
/* Try to place a lock on the index record */ /* Try to place a lock on the index record */
/* If innodb_locks_unsafe_for_binlog option is used, /* If innodb_locks_unsafe_for_binlog option is used,
we lock only the record, i.e. next-key locking is we lock only the record, i.e. next-key locking is
not used. not used.
*/ */
if ( srv_locks_unsafe_for_binlog )
{ if (srv_locks_unsafe_for_binlog) {
err = lock_clust_rec_read_check_and_lock(0, clust_rec, err = lock_clust_rec_read_check_and_lock(0,
index,node->row_lock_mode, LOCK_REC_NOT_GAP, thr); clust_rec,
} index, node->row_lock_mode,
else LOCK_REC_NOT_GAP, thr);
{ } else {
err = lock_clust_rec_read_check_and_lock(0, clust_rec, index, err = lock_clust_rec_read_check_and_lock(0,
node->row_lock_mode, LOCK_ORDINARY, thr); clust_rec,
index, node->row_lock_mode,
} LOCK_ORDINARY, thr);
}
if (err != DB_SUCCESS) {
if (err != DB_SUCCESS) {
return(err); return(err);
} }
...@@ -1205,22 +1206,24 @@ rec_loop: ...@@ -1205,22 +1206,24 @@ rec_loop:
if (!consistent_read) { if (!consistent_read) {
/* If innodb_locks_unsafe_for_binlog option is used, /* If innodb_locks_unsafe_for_binlog option is used,
we lock only the record, i.e. next-key locking is we lock only the record, i.e. next-key locking is
not used. not used.
*/ */
if ( srv_locks_unsafe_for_binlog ) if (srv_locks_unsafe_for_binlog) {
{ err = sel_set_rec_lock(page_rec_get_next(rec),
err = sel_set_rec_lock(page_rec_get_next(rec), index, index,
node->row_lock_mode, LOCK_REC_NOT_GAP, thr); node->row_lock_mode,
} LOCK_REC_NOT_GAP, thr);
else } else {
{ err = sel_set_rec_lock(page_rec_get_next(rec),
err = sel_set_rec_lock(page_rec_get_next(rec), index, index,
node->row_lock_mode, LOCK_ORDINARY, thr); node->row_lock_mode,
} LOCK_ORDINARY, thr);
if (err != DB_SUCCESS) { }
if (err != DB_SUCCESS) {
/* Note that in this case we will store in pcur /* Note that in this case we will store in pcur
the PREDECESSOR of the record we are waiting the PREDECESSOR of the record we are waiting
the lock for */ the lock for */
...@@ -1245,21 +1248,18 @@ rec_loop: ...@@ -1245,21 +1248,18 @@ rec_loop:
if (!consistent_read) { if (!consistent_read) {
/* Try to place a lock on the index record */ /* Try to place a lock on the index record */
/* If innodb_locks_unsafe_for_binlog option is used, /* If innodb_locks_unsafe_for_binlog option is used,
we lock only the record, i.e. next-key locking is we lock only the record, i.e. next-key locking is
not used. not used.
*/ */
if ( srv_locks_unsafe_for_binlog ) if (srv_locks_unsafe_for_binlog) {
{ err = sel_set_rec_lock(rec, index, node->row_lock_mode,
err = sel_set_rec_lock(rec, index, node->row_lock_mode,
LOCK_REC_NOT_GAP, thr); LOCK_REC_NOT_GAP, thr);
} } else {
else err = sel_set_rec_lock(rec, index, node->row_lock_mode,
{
err = sel_set_rec_lock(rec, index, node->row_lock_mode,
LOCK_ORDINARY, thr); LOCK_ORDINARY, thr);
} }
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
...@@ -3209,8 +3209,7 @@ rec_loop: ...@@ -3209,8 +3209,7 @@ rec_loop:
we do not lock gaps. Supremum record is really we do not lock gaps. Supremum record is really
a gap and therefore we do not set locks there. */ a gap and therefore we do not set locks there. */
if ( srv_locks_unsafe_for_binlog == FALSE ) if (srv_locks_unsafe_for_binlog == FALSE) {
{
err = sel_set_rec_lock(rec, index, err = sel_set_rec_lock(rec, index,
prebuilt->select_lock_type, prebuilt->select_lock_type,
LOCK_ORDINARY, thr); LOCK_ORDINARY, thr);
...@@ -3312,11 +3311,18 @@ rec_loop: ...@@ -3312,11 +3311,18 @@ rec_loop:
if (prebuilt->select_lock_type != LOCK_NONE if (prebuilt->select_lock_type != LOCK_NONE
&& set_also_gap_locks) { && set_also_gap_locks) {
/* Try to place a lock on the index record */
err = sel_set_rec_lock(rec, index, /* Try to place a gap lock on the index
record only if innodb_locks_unsafe_for_binlog
option is not set */
if (srv_locks_unsafe_for_binlog == FALSE) {
err = sel_set_rec_lock(rec, index,
prebuilt->select_lock_type, prebuilt->select_lock_type,
LOCK_GAP, thr); LOCK_GAP, thr);
}
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
goto lock_wait_or_error; goto lock_wait_or_error;
...@@ -3338,11 +3344,18 @@ rec_loop: ...@@ -3338,11 +3344,18 @@ rec_loop:
if (prebuilt->select_lock_type != LOCK_NONE if (prebuilt->select_lock_type != LOCK_NONE
&& set_also_gap_locks) { && set_also_gap_locks) {
/* Try to place a lock on the index record */
err = sel_set_rec_lock(rec, index, /* Try to place a gap lock on the index
record only if innodb_locks_unsafe_for_binlog
option is not set */
if (srv_locks_unsafe_for_binlog == FALSE) {
err = sel_set_rec_lock(rec, index,
prebuilt->select_lock_type, prebuilt->select_lock_type,
LOCK_GAP, thr); LOCK_GAP, thr);
}
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
goto lock_wait_or_error; goto lock_wait_or_error;
...@@ -3376,19 +3389,16 @@ rec_loop: ...@@ -3376,19 +3389,16 @@ rec_loop:
prebuilt->select_lock_type, prebuilt->select_lock_type,
LOCK_REC_NOT_GAP, thr); LOCK_REC_NOT_GAP, thr);
} else { } else {
/* If innodb_locks_unsafe_for_binlog option is used, /* If innodb_locks_unsafe_for_binlog option is used,
we lock only the record, i.e. next-key locking is we lock only the record, i.e. next-key locking is
not used. not used. */
*/
if ( srv_locks_unsafe_for_binlog ) if (srv_locks_unsafe_for_binlog) {
{ err = sel_set_rec_lock(rec, index,
err = sel_set_rec_lock(rec, index,
prebuilt->select_lock_type, prebuilt->select_lock_type,
LOCK_REC_NOT_GAP, thr); LOCK_REC_NOT_GAP, thr);
} } else {
else err = sel_set_rec_lock(rec, index,
{
err = sel_set_rec_lock(rec, index,
prebuilt->select_lock_type, prebuilt->select_lock_type,
LOCK_ORDINARY, thr); LOCK_ORDINARY, thr);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment