Is this "compare and swap" statement always atomic regardless of engine (e.g. InnoDB or MyISAM)? :
UPDATE tbl_name SET locked=1 WHERE id=ID AND locked <> 1;
I ask this because I intend to use this statement to do pseudo row-level locking that is compatible with both transactional and non-transactional database tables.
This is the method that is recommended for MyISAM, but I am uncertain as to whether this works for InnoDB since the documentation suggests using transactions instead.
Yes. In InnoDB, the row will be locked (make you have an unique index on id, the update locks all rows it has to scan), updated and the lock released. If you are not in an explicit transaction / auto-commit is on, each statement is run in its own transaction, but it's still a transaction and lockings are performed
来源:https://stackoverflow.com/questions/11502135/mysql-atomic-update-in-innodb-vs-myisam