mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
Bug #11765218 58157: INNODB LOCKS AN UNMATCHED ROW EVEN THOUGH USING
RBR AND RC Description: When scanning and locking rows with < or <=, InnoDB locks the next row even though row based binary logging and read committed is used. Solution: In the handler, when the row is identified to fall outside of the range (as specified in the query predicates), then request the storage engine to unlock the row (if possible). This is done in handler::read_range_first() and handler::read_range_next().
This commit is contained in:
@@ -4287,7 +4287,19 @@ int handler::read_range_first(const key_range *start_key,
|
||||
? HA_ERR_END_OF_FILE
|
||||
: result);
|
||||
|
||||
DBUG_RETURN (compare_key(end_range) <= 0 ? 0 : HA_ERR_END_OF_FILE);
|
||||
if (compare_key(end_range) <= 0)
|
||||
{
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
The last read row does not fall in the range. So request
|
||||
storage engine to release row lock if possible.
|
||||
*/
|
||||
unlock_row();
|
||||
DBUG_RETURN(HA_ERR_END_OF_FILE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4319,7 +4331,20 @@ int handler::read_range_next()
|
||||
result= index_next(table->record[0]);
|
||||
if (result)
|
||||
DBUG_RETURN(result);
|
||||
DBUG_RETURN(compare_key(end_range) <= 0 ? 0 : HA_ERR_END_OF_FILE);
|
||||
|
||||
if (compare_key(end_range) <= 0)
|
||||
{
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
The last read row does not fall in the range. So request
|
||||
storage engine to release row lock if possible.
|
||||
*/
|
||||
unlock_row();
|
||||
DBUG_RETURN(HA_ERR_END_OF_FILE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user