Commit d43b4a2a authored by monty@donna.mysql.com's avatar monty@donna.mysql.com

Fixed performance bug in lock tables

parent b355c2e9
...@@ -38723,6 +38723,12 @@ though, so Version 3.23 is not released as a stable version yet. ...@@ -38723,6 +38723,12 @@ though, so Version 3.23 is not released as a stable version yet.
@appendixsubsec Changes in release 3.23.28 @appendixsubsec Changes in release 3.23.28
@itemize @bullet @itemize @bullet
@item @item
Fixed a major performance bug in the table locking code when you
constantly had a LOT of @code{SELECT} running on a table on which you
also did a lot of @code{UPDATE} and @code{INSERT}. The symptom was that
the @code{UPDATE} and @code{INSERT} queries was locked a long time
while @code{SELECT} statements where executed without locks.
@item
One can now specify @code{interactive-timeout} in the option file that One can now specify @code{interactive-timeout} in the option file that
is read by @code{mysql_options()}. This makes it possible to force is read by @code{mysql_options()}. This makes it possible to force
programs that runs for a long time (like @code{mysqlhotcopy}) to use programs that runs for a long time (like @code{mysqlhotcopy}) to use
...@@ -43268,6 +43274,8 @@ Secure connections (with SSL). ...@@ -43268,6 +43274,8 @@ Secure connections (with SSL).
@item @item
Extend the optimizer to be able to optimize some Extend the optimizer to be able to optimize some
@code{ORDER BY key_name DESC} queries. @code{ORDER BY key_name DESC} queries.
@item
New key cache
@end itemize @end itemize
@node TODO future, TODO sometime, TODO MySQL 4.0, TODO @node TODO future, TODO sometime, TODO MySQL 4.0, TODO
...@@ -653,7 +653,7 @@ void thr_unlock(THR_LOCK_DATA *data) ...@@ -653,7 +653,7 @@ void thr_unlock(THR_LOCK_DATA *data)
data->type=TL_UNLOCK; /* Mark unlocked */ data->type=TL_UNLOCK; /* Mark unlocked */
check_locks(lock,"after releasing lock",1); check_locks(lock,"after releasing lock",1);
if (!lock->write.data) /* If no active read locks */ if (!lock->write.data) /* If no active write locks */
{ {
data=lock->write_wait.data; data=lock->write_wait.data;
if (!lock->read.data) /* If no more locks in use */ if (!lock->read.data) /* If no more locks in use */
...@@ -742,7 +742,7 @@ void thr_unlock(THR_LOCK_DATA *data) ...@@ -742,7 +742,7 @@ void thr_unlock(THR_LOCK_DATA *data)
data->next->prev= data->prev; data->next->prev= data->prev;
else else
lock->write_wait.last=data->prev; lock->write_wait.last=data->prev;
(*lock->write.last)=data; /* Put in execute list */ (*lock->write.last)=data; /* Put in execute list */
data->prev=lock->write.last; data->prev=lock->write.last;
lock->write.last= &data->next; lock->write.last= &data->next;
data->next=0; /* Only one write lock */ data->next=0; /* Only one write lock */
...@@ -756,7 +756,7 @@ void thr_unlock(THR_LOCK_DATA *data) ...@@ -756,7 +756,7 @@ void thr_unlock(THR_LOCK_DATA *data)
(lock_type == TL_WRITE_CONCURRENT_INSERT || (lock_type == TL_WRITE_CONCURRENT_INSERT ||
lock_type == TL_WRITE_ALLOW_WRITE)); lock_type == TL_WRITE_ALLOW_WRITE));
} }
else if (lock->read_wait.data) else if (!data && lock->read_wait.data)
free_all_read_locks(lock,0); free_all_read_locks(lock,0);
} }
end: end:
......
...@@ -31,6 +31,6 @@ ...@@ -31,6 +31,6 @@
char *llstr(longlong value,char *buff) char *llstr(longlong value,char *buff)
{ {
longlong2str(value,buff,10); longlong2str(value,buff,-10);
return buff; return buff;
} }
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