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(
if (!node->read_view) {
/* Try to place a lock on the index record */
/* If innodb_locks_unsafe_for_binlog option is used,
we lock only the record, i.e. next-key locking is
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 (err != DB_SUCCESS) {
/* If innodb_locks_unsafe_for_binlog option is used,
we lock only the record, i.e. next-key locking is
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 (err != DB_SUCCESS) {
return(err);
}
......@@ -1205,22 +1206,24 @@ row_sel(
if (!consistent_read) {
/* If innodb_locks_unsafe_for_binlog option is used,
we lock only the record, i.e. next-key locking is
not used.
*/
if ( srv_locks_unsafe_for_binlog )
{
err = sel_set_rec_lock(page_rec_get_next(rec), index,
node->row_lock_mode, LOCK_REC_NOT_GAP, thr);
}
else
{
err = sel_set_rec_lock(page_rec_get_next(rec), index,
node->row_lock_mode, LOCK_ORDINARY, thr);
}
if (err != DB_SUCCESS) {
/* If innodb_locks_unsafe_for_binlog option is used,
we lock only the record, i.e. next-key locking is
not used.
*/
if (srv_locks_unsafe_for_binlog) {
err = sel_set_rec_lock(page_rec_get_next(rec),
index,
node->row_lock_mode,
LOCK_REC_NOT_GAP, thr);
} else {
err = sel_set_rec_lock(page_rec_get_next(rec),
index,
node->row_lock_mode,
LOCK_ORDINARY, thr);
}
if (err != DB_SUCCESS) {
/* Note that in this case we will store in pcur
the PREDECESSOR of the record we are waiting
the lock for */
......@@ -1245,21 +1248,18 @@ row_sel(
if (!consistent_read) {
/* Try to place a lock on the index record */
/* If innodb_locks_unsafe_for_binlog option is used,
we lock only the record, i.e. next-key locking is
not used.
*/
/* If innodb_locks_unsafe_for_binlog option is used,
we lock only the record, i.e. next-key locking is
not used.
*/
if ( srv_locks_unsafe_for_binlog )
{
err = sel_set_rec_lock(rec, index, node->row_lock_mode,
if (srv_locks_unsafe_for_binlog) {
err = sel_set_rec_lock(rec, index, node->row_lock_mode,
LOCK_REC_NOT_GAP, thr);
}
else
{
err = sel_set_rec_lock(rec, index, node->row_lock_mode,
} else {
err = sel_set_rec_lock(rec, index, node->row_lock_mode,
LOCK_ORDINARY, thr);
}
}
if (err != DB_SUCCESS) {
......@@ -3209,8 +3209,7 @@ row_search_for_mysql(
we do not lock gaps. Supremum record is really
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,
prebuilt->select_lock_type,
LOCK_ORDINARY, thr);
......@@ -3312,11 +3311,18 @@ row_search_for_mysql(
if (prebuilt->select_lock_type != LOCK_NONE
&& 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,
LOCK_GAP, thr);
}
if (err != DB_SUCCESS) {
goto lock_wait_or_error;
......@@ -3338,11 +3344,18 @@ row_search_for_mysql(
if (prebuilt->select_lock_type != LOCK_NONE
&& 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,
LOCK_GAP, thr);
}
if (err != DB_SUCCESS) {
goto lock_wait_or_error;
......@@ -3376,19 +3389,16 @@ row_search_for_mysql(
prebuilt->select_lock_type,
LOCK_REC_NOT_GAP, thr);
} else {
/* If innodb_locks_unsafe_for_binlog option is used,
we lock only the record, i.e. next-key locking is
not used.
*/
if ( srv_locks_unsafe_for_binlog )
{
err = sel_set_rec_lock(rec, index,
/* If innodb_locks_unsafe_for_binlog option is used,
we lock only the record, i.e. next-key locking is
not used. */
if (srv_locks_unsafe_for_binlog) {
err = sel_set_rec_lock(rec, index,
prebuilt->select_lock_type,
LOCK_REC_NOT_GAP, thr);
}
else
{
err = sel_set_rec_lock(rec, index,
} else {
err = sel_set_rec_lock(rec, index,
prebuilt->select_lock_type,
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