mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Reduce the next-key locking of READ UNCOMMITTED to match that of
READ COMMITTED in the InnoDB Plugin. (Bug #48607)
This commit is contained in:
@@ -1,3 +1,10 @@
|
|||||||
|
2010-04-27 The InnoDB Team
|
||||||
|
|
||||||
|
* handler/ha_innodb.cc, lock/lock0lock.c, row/row0mysql.c,
|
||||||
|
row/row0sel.c:
|
||||||
|
Fix Bug#48607 READ UNCOMMITTED uses more locks than READ COMMITTED
|
||||||
|
in InnoDB 5.1+
|
||||||
|
|
||||||
2010-04-26 The InnoDB Team
|
2010-04-26 The InnoDB Team
|
||||||
|
|
||||||
* row/row0sel.c:
|
* row/row0sel.c:
|
||||||
|
@@ -5137,7 +5137,7 @@ ha_innobase::unlock_row(void)
|
|||||||
case ROW_READ_WITH_LOCKS:
|
case ROW_READ_WITH_LOCKS:
|
||||||
if (!srv_locks_unsafe_for_binlog
|
if (!srv_locks_unsafe_for_binlog
|
||||||
&& prebuilt->trx->isolation_level
|
&& prebuilt->trx->isolation_level
|
||||||
!= TRX_ISO_READ_COMMITTED) {
|
> TRX_ISO_READ_COMMITTED) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* fall through */
|
/* fall through */
|
||||||
@@ -5176,7 +5176,7 @@ ha_innobase::try_semi_consistent_read(bool yes)
|
|||||||
|
|
||||||
if (yes
|
if (yes
|
||||||
&& (srv_locks_unsafe_for_binlog
|
&& (srv_locks_unsafe_for_binlog
|
||||||
|| prebuilt->trx->isolation_level == TRX_ISO_READ_COMMITTED)) {
|
|| prebuilt->trx->isolation_level <= TRX_ISO_READ_COMMITTED)) {
|
||||||
prebuilt->row_read_type = ROW_READ_TRY_SEMI_CONSISTENT;
|
prebuilt->row_read_type = ROW_READ_TRY_SEMI_CONSISTENT;
|
||||||
} else {
|
} else {
|
||||||
prebuilt->row_read_type = ROW_READ_WITH_LOCKS;
|
prebuilt->row_read_type = ROW_READ_WITH_LOCKS;
|
||||||
@@ -9095,7 +9095,7 @@ ha_innobase::store_lock(
|
|||||||
isolation_level = trx->isolation_level;
|
isolation_level = trx->isolation_level;
|
||||||
|
|
||||||
if ((srv_locks_unsafe_for_binlog
|
if ((srv_locks_unsafe_for_binlog
|
||||||
|| isolation_level == TRX_ISO_READ_COMMITTED)
|
|| isolation_level <= TRX_ISO_READ_COMMITTED)
|
||||||
&& isolation_level != TRX_ISO_SERIALIZABLE
|
&& isolation_level != TRX_ISO_SERIALIZABLE
|
||||||
&& (lock_type == TL_READ || lock_type == TL_READ_NO_INSERT)
|
&& (lock_type == TL_READ || lock_type == TL_READ_NO_INSERT)
|
||||||
&& (sql_command == SQLCOM_INSERT_SELECT
|
&& (sql_command == SQLCOM_INSERT_SELECT
|
||||||
|
@@ -2400,7 +2400,7 @@ lock_rec_inherit_to_gap(
|
|||||||
if (!lock_rec_get_insert_intention(lock)
|
if (!lock_rec_get_insert_intention(lock)
|
||||||
&& !((srv_locks_unsafe_for_binlog
|
&& !((srv_locks_unsafe_for_binlog
|
||||||
|| lock->trx->isolation_level
|
|| lock->trx->isolation_level
|
||||||
== TRX_ISO_READ_COMMITTED)
|
<= TRX_ISO_READ_COMMITTED)
|
||||||
&& lock_get_mode(lock) == LOCK_X)) {
|
&& lock_get_mode(lock) == LOCK_X)) {
|
||||||
|
|
||||||
lock_rec_add_to_queue(LOCK_REC | LOCK_GAP
|
lock_rec_add_to_queue(LOCK_REC | LOCK_GAP
|
||||||
|
@@ -1458,7 +1458,7 @@ row_unlock_for_mysql(
|
|||||||
|
|
||||||
if (UNIV_UNLIKELY
|
if (UNIV_UNLIKELY
|
||||||
(!srv_locks_unsafe_for_binlog
|
(!srv_locks_unsafe_for_binlog
|
||||||
&& trx->isolation_level != TRX_ISO_READ_COMMITTED)) {
|
&& trx->isolation_level > TRX_ISO_READ_COMMITTED)) {
|
||||||
|
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"InnoDB: Error: calling row_unlock_for_mysql though\n"
|
"InnoDB: Error: calling row_unlock_for_mysql though\n"
|
||||||
|
@@ -852,7 +852,7 @@ row_sel_get_clust_rec(
|
|||||||
trx = thr_get_trx(thr);
|
trx = thr_get_trx(thr);
|
||||||
|
|
||||||
if (srv_locks_unsafe_for_binlog
|
if (srv_locks_unsafe_for_binlog
|
||||||
|| trx->isolation_level == TRX_ISO_READ_COMMITTED) {
|
|| trx->isolation_level <= TRX_ISO_READ_COMMITTED) {
|
||||||
lock_type = LOCK_REC_NOT_GAP;
|
lock_type = LOCK_REC_NOT_GAP;
|
||||||
} else {
|
} else {
|
||||||
lock_type = LOCK_ORDINARY;
|
lock_type = LOCK_ORDINARY;
|
||||||
@@ -1465,7 +1465,7 @@ rec_loop:
|
|||||||
|
|
||||||
if (srv_locks_unsafe_for_binlog
|
if (srv_locks_unsafe_for_binlog
|
||||||
|| trx->isolation_level
|
|| trx->isolation_level
|
||||||
== TRX_ISO_READ_COMMITTED) {
|
<= TRX_ISO_READ_COMMITTED) {
|
||||||
|
|
||||||
if (page_rec_is_supremum(next_rec)) {
|
if (page_rec_is_supremum(next_rec)) {
|
||||||
|
|
||||||
@@ -1522,7 +1522,7 @@ skip_lock:
|
|||||||
trx = thr_get_trx(thr);
|
trx = thr_get_trx(thr);
|
||||||
|
|
||||||
if (srv_locks_unsafe_for_binlog
|
if (srv_locks_unsafe_for_binlog
|
||||||
|| trx->isolation_level == TRX_ISO_READ_COMMITTED) {
|
|| trx->isolation_level <= TRX_ISO_READ_COMMITTED) {
|
||||||
|
|
||||||
if (page_rec_is_supremum(rec)) {
|
if (page_rec_is_supremum(rec)) {
|
||||||
|
|
||||||
@@ -3665,7 +3665,7 @@ shortcut_fails_too_big_rec:
|
|||||||
&& !page_rec_is_supremum(rec)
|
&& !page_rec_is_supremum(rec)
|
||||||
&& set_also_gap_locks
|
&& set_also_gap_locks
|
||||||
&& !(srv_locks_unsafe_for_binlog
|
&& !(srv_locks_unsafe_for_binlog
|
||||||
|| trx->isolation_level == TRX_ISO_READ_COMMITTED)
|
|| trx->isolation_level <= TRX_ISO_READ_COMMITTED)
|
||||||
&& prebuilt->select_lock_type != LOCK_NONE) {
|
&& prebuilt->select_lock_type != LOCK_NONE) {
|
||||||
|
|
||||||
/* Try to place a gap lock on the next index record
|
/* Try to place a gap lock on the next index record
|
||||||
@@ -3761,7 +3761,7 @@ rec_loop:
|
|||||||
|
|
||||||
if (set_also_gap_locks
|
if (set_also_gap_locks
|
||||||
&& !(srv_locks_unsafe_for_binlog
|
&& !(srv_locks_unsafe_for_binlog
|
||||||
|| trx->isolation_level == TRX_ISO_READ_COMMITTED)
|
|| trx->isolation_level <= TRX_ISO_READ_COMMITTED)
|
||||||
&& prebuilt->select_lock_type != LOCK_NONE) {
|
&& prebuilt->select_lock_type != LOCK_NONE) {
|
||||||
|
|
||||||
/* Try to place a lock on the index record */
|
/* Try to place a lock on the index record */
|
||||||
@@ -3895,7 +3895,7 @@ wrong_offs:
|
|||||||
if (set_also_gap_locks
|
if (set_also_gap_locks
|
||||||
&& !(srv_locks_unsafe_for_binlog
|
&& !(srv_locks_unsafe_for_binlog
|
||||||
|| trx->isolation_level
|
|| trx->isolation_level
|
||||||
== TRX_ISO_READ_COMMITTED)
|
<= TRX_ISO_READ_COMMITTED)
|
||||||
&& prebuilt->select_lock_type != LOCK_NONE) {
|
&& prebuilt->select_lock_type != LOCK_NONE) {
|
||||||
|
|
||||||
/* Try to place a gap lock on the index
|
/* Try to place a gap lock on the index
|
||||||
@@ -3931,7 +3931,7 @@ wrong_offs:
|
|||||||
if (set_also_gap_locks
|
if (set_also_gap_locks
|
||||||
&& !(srv_locks_unsafe_for_binlog
|
&& !(srv_locks_unsafe_for_binlog
|
||||||
|| trx->isolation_level
|
|| trx->isolation_level
|
||||||
== TRX_ISO_READ_COMMITTED)
|
<= TRX_ISO_READ_COMMITTED)
|
||||||
&& prebuilt->select_lock_type != LOCK_NONE) {
|
&& prebuilt->select_lock_type != LOCK_NONE) {
|
||||||
|
|
||||||
/* Try to place a gap lock on the index
|
/* Try to place a gap lock on the index
|
||||||
@@ -3979,7 +3979,7 @@ wrong_offs:
|
|||||||
|
|
||||||
if (!set_also_gap_locks
|
if (!set_also_gap_locks
|
||||||
|| srv_locks_unsafe_for_binlog
|
|| srv_locks_unsafe_for_binlog
|
||||||
|| trx->isolation_level == TRX_ISO_READ_COMMITTED
|
|| trx->isolation_level <= TRX_ISO_READ_COMMITTED
|
||||||
|| (unique_search
|
|| (unique_search
|
||||||
&& !UNIV_UNLIKELY(rec_get_deleted_flag(rec, comp)))) {
|
&& !UNIV_UNLIKELY(rec_get_deleted_flag(rec, comp)))) {
|
||||||
|
|
||||||
@@ -4018,7 +4018,7 @@ no_gap_lock:
|
|||||||
const rec_t* old_vers;
|
const rec_t* old_vers;
|
||||||
case DB_SUCCESS:
|
case DB_SUCCESS:
|
||||||
if (srv_locks_unsafe_for_binlog
|
if (srv_locks_unsafe_for_binlog
|
||||||
|| trx->isolation_level == TRX_ISO_READ_COMMITTED) {
|
|| trx->isolation_level <= TRX_ISO_READ_COMMITTED) {
|
||||||
/* Note that a record of
|
/* Note that a record of
|
||||||
prebuilt->index was locked. */
|
prebuilt->index was locked. */
|
||||||
prebuilt->new_rec_locks = 1;
|
prebuilt->new_rec_locks = 1;
|
||||||
@@ -4151,7 +4151,7 @@ no_gap_lock:
|
|||||||
/* The record is delete-marked: we can skip it */
|
/* The record is delete-marked: we can skip it */
|
||||||
|
|
||||||
if ((srv_locks_unsafe_for_binlog
|
if ((srv_locks_unsafe_for_binlog
|
||||||
|| trx->isolation_level == TRX_ISO_READ_COMMITTED)
|
|| trx->isolation_level <= TRX_ISO_READ_COMMITTED)
|
||||||
&& prebuilt->select_lock_type != LOCK_NONE
|
&& prebuilt->select_lock_type != LOCK_NONE
|
||||||
&& !did_semi_consistent_read) {
|
&& !did_semi_consistent_read) {
|
||||||
|
|
||||||
@@ -4218,7 +4218,7 @@ requires_clust_rec:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((srv_locks_unsafe_for_binlog
|
if ((srv_locks_unsafe_for_binlog
|
||||||
|| trx->isolation_level == TRX_ISO_READ_COMMITTED)
|
|| trx->isolation_level <= TRX_ISO_READ_COMMITTED)
|
||||||
&& prebuilt->select_lock_type != LOCK_NONE) {
|
&& prebuilt->select_lock_type != LOCK_NONE) {
|
||||||
/* Note that both the secondary index record
|
/* Note that both the secondary index record
|
||||||
and the clustered index record were locked. */
|
and the clustered index record were locked. */
|
||||||
@@ -4231,7 +4231,7 @@ requires_clust_rec:
|
|||||||
/* The record is delete marked: we can skip it */
|
/* The record is delete marked: we can skip it */
|
||||||
|
|
||||||
if ((srv_locks_unsafe_for_binlog
|
if ((srv_locks_unsafe_for_binlog
|
||||||
|| trx->isolation_level == TRX_ISO_READ_COMMITTED)
|
|| trx->isolation_level <= TRX_ISO_READ_COMMITTED)
|
||||||
&& prebuilt->select_lock_type != LOCK_NONE) {
|
&& prebuilt->select_lock_type != LOCK_NONE) {
|
||||||
|
|
||||||
/* No need to keep a lock on a delete-marked
|
/* No need to keep a lock on a delete-marked
|
||||||
@@ -4442,7 +4442,7 @@ lock_wait_or_error:
|
|||||||
moves_up, &mtr);
|
moves_up, &mtr);
|
||||||
|
|
||||||
if ((srv_locks_unsafe_for_binlog
|
if ((srv_locks_unsafe_for_binlog
|
||||||
|| trx->isolation_level == TRX_ISO_READ_COMMITTED)
|
|| trx->isolation_level <= TRX_ISO_READ_COMMITTED)
|
||||||
&& !same_user_rec) {
|
&& !same_user_rec) {
|
||||||
|
|
||||||
/* Since we were not able to restore the cursor
|
/* Since we were not able to restore the cursor
|
||||||
|
Reference in New Issue
Block a user