【问题标题】:Is MySQL "thread safe" from a php script?php脚本中的MySQL“线程安全”吗?
【发布时间】:2012-03-20 10:11:37
【问题描述】:

如果我有一个在 MySQL 连接上调用 INSERT、UPDATE、DELETE 等的 php 脚本,并且该脚本在不受控制的时间被 POST 操作调用,它是否总是“安全”的(即,不会导致损坏请求期间的表或冲突)?

例如,如果 1 秒内有 500 个请求。

如果有,php/mysql是如何实现的?

如果不是,需要做些什么来保证“串行”访问或安全的同时访问?

【问题讨论】:

  • BEGIN; ... do work ...; COMMIT;

标签: php mysql thread-safety


【解决方案1】:

MySQL 使用锁定(MyISAM 的表级或 InnoDB 的行级),它不允许 2 个进程(2 次调用脚本)修改同一行。所以表不会崩溃*,但是 MySQL 可能无法在合理的时间内处理请求的数量,请求将等待。您应该始终尽可能快地优化查询。

*MyISAM 可能会在插入/更新密集型应用程序上崩溃,但它具有自动恢复功能。但是请记住,在这样的应用程序中,InnoDB 的性能要好得多

【讨论】:

  • 这个问题有很多很好的答案;我无法相信社区在这种情况下的速度和反应——谢谢。我相信,对于寻求构建坚如磐石的企业级实施的人来说,其他一些答案可能更具指导意义——如果是你,请参见下文。然而,我试图尽可能少地做,只是想知道 mysql 是否可以处理大量同时请求。答案是肯定的,任何没有得到专门报酬以了解另一个答案的人。谢谢达哈泽。
【解决方案2】:

它是否总是“安全”的(即在请求期间不会导致表损坏或冲突)?

是的

如果是这样,php/mysql是如何实现的?

表/行锁。

【讨论】:

    【解决方案3】:

    MySQL 对Isoloation 使用锁,对原子性使用transactions。事务需要 InnoDB 或 BDB。 InnoDB 支持完整的ACID 支持。

    锁和事务相结合,将解决您的并发问题。

    默认情况下,MySQL 有implicit transactions

    一定要了解这些功能,看看它们是否符合要求。 MyISAM 使用表锁定,而 InnoDB 提供行级锁定,因此一个可能比另一个更好地满足您的需求。

    【讨论】:

      【解决方案4】:

      通常数据库不会发生冲突,但是有一些重要的操作必须完成或丢弃。想想银行账户上的现金存款。

      为了达到这个结果,您可能会对使用事务感兴趣:

      PHP + MySQL transactions examples

      【讨论】:

        【解决方案5】:

        使用交易...见this

        【讨论】:

          【解决方案6】:

          我认为您正在寻找的术语是事务和隔离级别。如果这些是根据您的要求设置的,则无需担心冲突。这是how it works的教程。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-15
            • 2021-06-03
            • 1970-01-01
            • 1970-01-01
            • 2010-12-10
            相关资源
            最近更新 更多