Search code examples
mysqlthread-safetyatomicincrement

Is incrementing a field in MySQL atomic?


I'm making a web site where I would like to increment a counter in a standard MyISAM table.

Simplified example:

UPDATE votes SET num = num + 1;

Will this cause problems if multiple connections are doing the same query, or will MySQL take care of it and lock the table or something to make sure that there are no conflicts?


Solution

  • MyISAM tables use table level locking. This means that the whole table will be locked during the execution of your update query. So the answer for your simplified use case is: yes, this is thread safe. But this may not be the case if you use another storage engine or your update includes multiple tables.

    Here is a quote from the MySQL manual for more clarity:

    Table locking enables many sessions to read from a table at the same time, but if a session wants to write to a table, it must first get exclusive access. During the update, all other sessions that want to access this particular table must wait until the update is done.

    You can also consider using auto increment columns, transactions or external synchronization if that fits to your design.

    Cheers!