2013-04-08 58 views
2

我是新来的PHP开发,我想创建一个php-mysql的Web应用程序。在这个应用程序中,我有可能在同一时间对同一行有一个“UPDATE”语句和一个“SELECT”查询的情况。这里是我的问题出现在哪里。 MySQL在更新时是否自动锁定行,以便select查询会等待它?php mysql - 更新时mysql会自动锁定行吗?

如果是,那么select查询是否会等待,直到更新查询已准备好(事务完成),然后执行?或者他们会失败,我将不得不在应用程序中管理以重新发布它们?

关于如何处理这种情况的任何建议?

+0

我不是100%确定行锁,因为我不是SQL专家。但是,如果使用UPDATE查询运行PHP脚本,然后执行SELECT查询,则脚本将不会继续,直到处理UPDATE查询(因此SELECT始终会获取最新信息)。 – Sam 2013-04-08 06:11:10

回答

6

是的行将被锁定,直到更新命令完成。选择只会在update命令执行成功后才会执行。

希望你可能听说过ACID特性。
这里是他们:

原子性
好像他们是一个单一的操作数据的所有更改执行。也就是说,所有的改变都被执行,或者它们都不是。
例如,在将资金从一个帐户转移到另一个帐户的应用程序中,原子性属性可确保如果从一个帐户成功进行借记,则相应的功劳将发放到另一个帐户。

一致性
当事务开始时以及结束时数据处于一致状态。 例如,在将资金从一个账户转移到另一个账户的应用程序中,一致性属性可确保两个账户中资金的总值在每笔交易的开始和结束时保持不变。

隔离
交易的中间状态对其他交易是不可见的。结果,同时运行的事务似乎被序列化。
例如,在将资金从一个账户转移到另一个账户的应用程序中,隔离属性确保另一个交易将转移的资金看到一个账户或另一个账户中,但不是同时存在,也不存在。

耐久性
交易成功完成后,更改数据,并坚持不撤消,即使在系统故障的情况下。
例如,在将资金从一个帐户转移到另一个帐户的应用程序中,耐久性属性可确保对每个帐户所做的更改不会被撤销。

所有这些属性都适用于sql事务。