MySQL并发,它是如何工作的,我需要在我的应用程序中处理它

med*_*ium 26 mysql

我目前正在运行MySQL数据库.我的所有表都使用Table Engine InnoDB.

登录我的应用程序的每个人都可以查看记录,我担心在某些时候两个用户可能同时更新或插入记录.MySQL是否优雅地处理这种类型的并发问题,或者这是我必须编程到我的代码中的东西?

如果我必须将它编程到我的代码中,你如何处理这样的并发案例?

Sjo*_*erd 29

SQL语句是原子的.也就是说,如果你执行这样的事情:

UPDATE Cars SET Sold = Sold + 1
Run Code Online (Sandbox Code Playgroud)

Sold在此声明中,没有人可以更改变量.它总是递增1,即使其他人同时执行相同的语句也是如此.

如果您有相互依赖的语句,则会出现此问题:

a = SELECT Sold FROM Cars;
UPDATE Cars SET Sold = a + 1;
Run Code Online (Sandbox Code Playgroud)

在这些查询之间,另一个用户可以更改表Cars并更新Sold.要防止这种情况,请将其包装在事务中:

BEGIN;
a = SELECT Sold FROM Cars;
UPDATE Cars SET Sold = a + 1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

InnoDB支持事务,但MyISAM不支持.

  • 即使在交易中也无法保证.默认情况下,MySQL仅对写操作执行行级锁定/表锁定,即使在事务中也是如此.要使**a**具有正确的值,必须在SELECT中放置*FOR UPDATE*,或者在TRANSACTION上指定更高的*隔离级别*为*SERIALIZABLE*.**更多信息:**[内部锁定](https://dev.mysql.com/doc/refman/5.6/en/internal-locking.html),[隔离级别](https://dev.mysql. com/doc/refman/5.6/en/innodb-transaction-isolation-levels.html),[锁定读取](https://dev.mysql.com/doc/refman/5.6/en/innodb-locking-reads. HTML) (6认同)