Can you try the same on a big table, I think optimizer is choosing a FTS
over an index lookup.


On Wed, Sep 3, 2014 at 8:25 PM, geetanjali mehra <mailtogeetanj...@gmail.com
> wrote:

> This is what I am doing.
>
> mysql> select * from new;
> +------+------+
> | c1   | c2   |
> +------+------+
> |    5 |    5 |
> |   10 |   10 |
> |   15 |   15 |
> |   20 |   20 |
> |   30 |   30 |
> +------+------+
>
>
> Now,
>
> Session 1
>
>
> mysql> begin;
>
> Query OK, 0 rows affected (0.00 sec)
>
>
>
> mysql> select * from new where c1 between 10 and 25 for update;
>
> +------+------+
>
> | c1   | c2   |
>
> +------+------+
>
> |   10 |   10 |
>
> |   15 |   15 |
>
> |   20 |   20 |
>
> +------+------+
>
> 3 rows in set (0.00 sec)
>
>
>
>
>
>
>
>
>
> mysql>begin;
>
> mysql> insert into new values(29,29);
>
> (session is hanging)
>
> mysql> insert into new values(31,31);
>
> (session is hanging
>
>
> The last value on my table is 30.  Still it is not allowing me to insert
> 31.
>
> I tried the scenario without index on column c1 and then with non-unique
> index on column c1 and then unique index.  I am getting the same result. It
> seems that it is putting up lock on complete table.
>
> The scenario is working fine only when I made c1 primary key.  After
> making c1 primary key, I am able to insert value higher than 30.
>
> Can you please try the same scenario at your end?
>
>
>
>
> Best Regards,
> Geetanjali Mehra
> Senior Oracle and MySQL DBA Corporate Trainer and Database Security
> Specialist
>
>
>
> On Tue, Sep 2, 2014 at 1:53 PM, Akshay Suryavanshi <
> akshay.suryavansh...@gmail.com> wrote:
>
>> Hello Geetanjali,
>>
>> Apologies if I have confused you with the "normal Select" notation. I
>> meant to write with repeatable-read mode in mind, but looks like that is
>> not an issue, since you already tested this scenario with that isolation
>> mode.
>>
>> Moving further to the original issue.
>>
>> Do you have an index on column c1. Is the query "Select * from new where
>> c1 between 12 and 17 for update;" using index ? If there is no index on
>> the particular column, then InnoDB locks out whole table from other
>> transactions. Which is the case you mentioned. Also this can be dangerous.
>> Once you have indexed the column checkout the innodb status, you will see
>> the necessary locking. Also try updating values beyond the boundary values.
>>
>> So most important fact to know here is the involvement of secondary
>> indexes to introduce record locking, gap locking, and how their absence
>> will affect the transaction. As to "Why" this is happening ? It should be
>> understood that in InnoDB secondary keys are appended to PRIMARY index, so
>> if there is no index to search the records PRIMARY index values cannot be
>> filtered. In absence of secondary indexes a full scan is needed. And
>> finally Innodb table is one big Index (Clustered table).
>>
>> *By default, InnoDB operates in REPEATABLE READ
>> <http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html#isolevel_repeatable-read>
>>  transaction
>> isolation level and with theinnodb_locks_unsafe_for_binlog
>> <http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_locks_unsafe_for_binlog>
>>  system
>> variable disabled. In this case, InnoDB uses next-key locks for searches
>> and index scans, which prevents phantom rows.*
>>
>> So Index scan above is infact a Full-table-scan (full index scan)
>>
>> Please try it out and let me know if you observe any difference.
>>
>> Cheers!!!
>>  Akshay
>>
>>
>> On Tue, Sep 2, 2014 at 11:59 AM, geetanjali mehra <
>> mailtogeetanj...@gmail.com> wrote:
>>
>>> Dear Akshay,
>>>
>>> ASFIK, normal selects are always non-locking read and they do not put any
>>> locks.
>>> Select..., Select..........where......,Select ........where......between
>>>
>>> Does above select statement will use next-key locking and/or gap locking?
>>> I dont think so.
>>>
>>> Please correct me if I am wrong.
>>>
>>>
>>> Best Regards,
>>> Geetanjali Mehra
>>> Senior Oracle and MySQL DBA Corporate Trainer and Database Security
>>> Specialist
>>>
>>>
>>>
>>> On Fri, Aug 29, 2014 at 11:46 AM, Akshay Suryavanshi <
>>> akshay.suryavansh...@gmail.com> wrote:
>>>
>>> > Geetanjali,
>>> >
>>> > There is a difference between next-key locking, gap locking and locking
>>> > reads.
>>> >
>>> > Next-key locking and gap-locking are used with normal Selects
>>> statement in
>>> > Innodb, whereas locking reads wont release a lock on the whole column
>>> until
>>> > transaction completed, and not just selected values.
>>> >
>>> > May be you can try your example with SELECT... LOCK IN SHARE MODE;
>>> >
>>> > Cheers!!!
>>> > Akshay Suryawanshi
>>> >
>>> >
>>> > On Fri, Aug 29, 2014 at 11:22 AM, geetanjali mehra <
>>> > mailtogeetanj...@gmail.com> wrote:
>>> >
>>> >> Thanks for your reply.
>>> >>
>>> >> I read those docs. Still my doubt is at the same stage.  Please
>>> clarify
>>> >> the
>>> >> same to me.
>>> >>  Should not other sessions be allowed to insert the rows beyond that
>>> >> range.?
>>> >>
>>> >> As far as I understand, Innodb brought the concept of next-key locks
>>> so as
>>> >> to prevent phantom problem.   So, it is clear to me that issuing the
>>> below
>>> >> query
>>> >>
>>> >> Select * from new where c1 between 12 and 17 for update;
>>> >>
>>> >> will not allow other sessions to insert any value between 12 and 17.
>>> >>
>>> >> But if i am trying to insert 20 from other session, it is not
>>> allowed. Why
>>> >> this is so? The session is hanging.
>>> >>
>>> >> Best Regards,
>>> >> Geetanjali Mehra
>>> >> Senior Oracle and MySQL DBA Corporate Trainer and Database Security
>>> >> Specialist
>>> >>
>>> >>
>>> >>
>>> >> On Thu, Aug 28, 2014 at 2:26 AM, shawn l.green <
>>> shawn.l.gr...@oracle.com>
>>> >> wrote:
>>> >>
>>> >> >
>>> >> >
>>> >> > On 8/26/2014 1:12 AM, geetanjali mehra wrote:
>>> >> >
>>> >> >> Hello to all,
>>> >> >> In repeatable read isolation level, when we issue:
>>> >> >>
>>> >> >> Select * from new where c1 between 12 and 17 for update;
>>> >> >>
>>> >> >> this range will be locked by innodb by using next-key locks.
>>> >> >>
>>> >> >> But, why is is preventing any other session to insert any value
>>> beyond
>>> >> >> that
>>> >> >> range; any value above the range and any value below the range. I
>>> am
>>> >> >> unable
>>> >> >> to understand this.
>>> >> >>
>>> >> >
>>> >> > I believe you are confusing gap locking (the space between the
>>> values)
>>> >> and
>>> >> > next-key locking (the space after the range).
>>> >> >
>>> >> >
>>> http://dev.mysql.com/doc/refman/5.6/en/innodb-record-level-locks.html
>>> >> >
>>> >> > See also:
>>> >> > http://dev.mysql.com/doc/refman/5.6/en/innodb-next-key-locking.html
>>> >> > http://dev.mysql.com/doc/refman/5.6/en/innodb-locks-set.html
>>> >> >
>>> >> >
>>> >> >
>>> >> >> Best Regards,
>>> >> >> Geetanjali Mehra
>>> >> >> Senior Oracle and MySQL DBA Corporate Trainer and Database Security
>>> >> >> Specialist
>>> >> >>
>>> >> >>
>>> >> > Yours,
>>> >> > --
>>> >> > Shawn Green
>>> >> > MySQL Senior Principal Technical Support Engineer
>>> >> > Oracle USA, Inc. - Hardware and Software, Engineered to Work
>>> Together.
>>> >> > Office: Blountville, TN
>>> >> >
>>> >> > --
>>> >> > MySQL General Mailing List
>>> >> > For list archives: http://lists.mysql.com/mysql
>>> >> > To unsubscribe:    http://lists.mysql.com/mysql
>>> >> >
>>> >> >
>>> >>
>>> >
>>> >
>>>
>>
>>
>

Reply via email to