Commit d2d4b488 authored by unknown's avatar unknown

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


innobase/row/row0sel.c:
  Fixed bug: innodb_locks_unsafe_for_binlog still uses next-key locking (BUG #6747).
  We do not take gap type locks when using InnoDB startup option 
  innodb_locks_unsafe_for_binlog. Some code polishing also done.
parent 6d6b38c2
...@@ -642,16 +642,17 @@ row_sel_get_clust_rec( ...@@ -642,16 +642,17 @@ row_sel_get_clust_rec(
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 )
{
err = lock_clust_rec_read_check_and_lock(0, clust_rec,
index,node->row_lock_mode, LOCK_REC_NOT_GAP, thr);
}
else
{
err = lock_clust_rec_read_check_and_lock(0, clust_rec, index,
node->row_lock_mode, LOCK_ORDINARY, thr);
if (srv_locks_unsafe_for_binlog) {
err = lock_clust_rec_read_check_and_lock(0,
clust_rec,
index, node->row_lock_mode,
LOCK_REC_NOT_GAP, thr);
} else {
err = lock_clust_rec_read_check_and_lock(0,
clust_rec,
index, node->row_lock_mode,
LOCK_ORDINARY, thr);
} }
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
...@@ -1210,16 +1211,18 @@ rec_loop: ...@@ -1210,16 +1211,18 @@ rec_loop:
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
...@@ -1250,13 +1253,10 @@ rec_loop: ...@@ -1250,13 +1253,10 @@ rec_loop:
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);
} }
...@@ -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 */
/* 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, 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 */
/* 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, 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;
...@@ -3378,16 +3391,13 @@ rec_loop: ...@@ -3378,16 +3391,13 @@ rec_loop:
} 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