Php 可以同时执行两个或多个查询吗?

Php 可以同时执行两个或多个查询吗?,php,mysql,concurrency,Php,Mysql,Concurrency,好的,假设我们有银行账户表。有一行名为money。它有2000年的价值。我们有两个人试图取款,让我们假设他们能做到。那么,他们有可能同时这么做吗?例如有一个编造的代码: $all_money = get_value('money', 'bank_account); //lets suppose thats a function how we get value money from bank_account table if($all_money > 0) { //he

好的,假设我们有
银行账户
表。有一行名为
money
。它有2000年的价值。我们有两个人试图取款,让我们假设他们能做到。那么,他们有可能同时这么做吗?例如有一个编造的代码:

 $all_money = get_value('money', 'bank_account); //lets suppose thats a function how we get value money from bank_account table

 if($all_money > 0) 
 {
     //here is a code where those money are being withdrawed from bank_account and inserting into the person's account
 }


如果这两个人同时获得2000美元,则意味着将执行此条款
If($all\u money>0)
,两名玩家将获得2000美元,银行账户将获得-2000美元。那么,这有可能发生吗?如果是,我该如何保护它?谢谢。

在访问表之前执行以下操作:

LOCK TABLE table_name READ;
那会把桌子锁上的。完成工作后,您可以呼叫:

UNLOCK TABLES;

我认为一种方法是使用。当事务开始时,表将被锁定。这实际上与克里斯蒂安的提议相似。

innodb中的事务将帮助您实现这一点。记得阅读mysql版本,因为它们之前被安装了错误。

与此相反,SQL语句被接收并放入队列中进行处理。它们不是同时执行的


发生什么取决于业务规则-如果银行帐户允许透支,第二个请求将成功(假设透支足够大)。否则,第二个请求将失败。

我想您可能担心两个独立的线程连接到数据库,一个线程正在提取资金,而另一个线程正在执行基于先前读取的余额的代码

在这种情况下,您应该在查询余额之前应用读锁(正如Christian所说),并在if语句结束后[在代码片段中]释放锁


如果在线程仍然拥有锁的情况下发生任何事情,那么您可能会面临问题,因此需要一些精明的bash脚本来杀死这些东西;)

一个非常典型的例子是:

DELIMITER //
CREATE PROCEDURE do_banktransfer(
  IN transfer_amount INT,
  IN from_account    INT,
  IN to_account      INT,
  OUT success        INT)
BEGIN
START TRANSACTION;
UPDATE account SET balance = balance - transfer_amount WHERE id = from_account;
UPDATE account SET balance = balance + transfer_amount WHERE id = to_account;
SELECT balance INTO cur_balance FROM account WHERE id = from_account;
IF cur_balance < 0 THEN
    SET success = 0;
    ROLLBACK;
ELSE 
    SET success = 1;
    COMMIT;
END IF;
END;//
分隔符//
创建银行转账程序(
在转账金额INT中,
在from_账户INT中,
在to_账户INT中,
输出成功(整数)
开始
启动交易;
更新账户设置余额=余额-转账金额,其中id=来自账户;
更新账户设置余额=余额+转账金额,其中id=至账户;
从账户中选择余额到当前余额,其中id=从当前账户;
如果电流平衡<0,则
设置成功=0;
回降;
其他的
设置成功=1;
犯罪
如果结束;
结束//

真的吗?我实际上使用了事务,如果它是正确的,并且有人可以批准,那么这些都是好消息。我不确定它是否正确。我认为这根本不是正确的方法。我认为你的正确选择是克里斯蒂安C的建议。+1我会给你加2作为你的名字,如果我能……最好的名字。永远!我应该提到,隔离级别可能会使事情复杂化—默认设置允许选择优先级,这意味着在进行取款之前检查余额可能会返回值。“[SQL语句]不会同时执行”?是否要进一步限定此语句?你是说在执行任何SQL语句时都不会有任何重叠?我希望不是。