gpt4 book ai didi

php - 使用锁表时事务+回滚

转载 作者:行者123 更新时间:2023-11-29 12:46:49 27 4
gpt4 key购买 nike

这是以下内容的后续内容: php/mysql transaction not rolling back on failure (Codeigniter framework)

我在上面的链接中实现了建议的模式。我的问题是:

  1. 每次查询失败时都需要回滚吗?看来我必须检查每个查询的结果,然后在失败时进行回滚。这看起来有点重复。

    $this->db->query("SET autocommit=0");

    //Lock tables invovled in sale transaction so we don't have deadlock
    $this->db->query('LOCK TABLES '.$this->db->dbprefix('customers').' WRITE, '.$this->db->dbprefix('sales').' WRITE,
    '.$this->db->dbprefix('store_accounts').' WRITE, '.$this->db->dbprefix('sales_payments').' WRITE, '.$this->db->dbprefix('sales_items').' WRITE,
    '.$this->db->dbprefix('giftcards').' WRITE, '.$this->db->dbprefix('location_items').' WRITE,
    '.$this->db->dbprefix('inventory').' WRITE, '.$this->db->dbprefix('sales_items_taxes').' WRITE,
    '.$this->db->dbprefix('sales_item_kits').' WRITE, '.$this->db->dbprefix('sales_item_kits_taxes').' WRITE,'.$this->db->dbprefix('people').' READ,'.$this->db->dbprefix('items').' READ
    ,'.$this->db->dbprefix('employees_locations').' READ,'.$this->db->dbprefix('locations').' READ, '.$this->db->dbprefix('items_tier_prices').' READ
    , '.$this->db->dbprefix('location_items_tier_prices').' READ, '.$this->db->dbprefix('items_taxes').' READ, '.$this->db->dbprefix('item_kits').' READ
    , '.$this->db->dbprefix('location_item_kits').' READ, '.$this->db->dbprefix('item_kit_items').' READ, '.$this->db->dbprefix('employees').' READ , '.$this->db->dbprefix('item_kits_tier_prices').' READ
    , '.$this->db->dbprefix('location_item_kits_tier_prices').' READ, '.$this->db->dbprefix('location_items_taxes').' READ
    , '.$this->db->dbprefix('location_item_kits_taxes'). ' READ, '.$this->db->dbprefix('item_kits_taxes'). ' READ');

    if (!$this->db->insert('sales',$sales_data))
    {
    $this->db->query("ROLLBACK");
    $this->db->query('UNLOCK TABLES');
    return -1;
    }

......

$this->db->query("COMMIT");         
$this->db->query('UNLOCK TABLES');

最佳答案

您应该避免使用LOCK TABLESUNLOCK TABLES;,因为它可以触发隐式提交。相反,您应该考虑使用 SELECT ... FOR UPDATESELECT ... LOCK IN SHARED MODE

如果您使用的是 MySQL 5.6,请尝试使用以下命令启动事务

  • 开始事务读写;
  • 开始交易只读;

我在 DBA StackExchange 中写过有关此内容的文章(请参阅 row locking within ACID transaction innodb)

如果您仍然希望使用LOCK TABLES;UNLOCK TABLES,请记住LOCK TABLES会启动一个新事务,ROLLBACKCOMMIT 仍然是强制的,因为 UNLOCK TABLES; 会触发隐式提交。 ROLLBACK 让您有机会丢弃事务所持有的更改。 UNLOCK TABLES; 将提交您可能想要撤消的更改。

唯一的隐式回滚是数据库连接的终止。

关于php - 使用锁表时事务+回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25314048/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com