php - Yii2 事务 - 更新先前未提交的值加上新的提交值?

标签 php mysql transactions yii2

我正在尝试在 yii2 基本框架中实现事务。我编写了一个小测试脚本来测试事务。除了一个异常(exception),一切都很顺利。当我运行事务脚本并立即停止它时,数据库中没有发生任何更改。但是,当我运行脚本直到脚本完成时,数据库中已完成更改,但更改未按所需方式进行。例如,如果我的初始金额为 1000.00 并运行金额变量 amount+100 的脚本,如果我立即停止它,数据库中不会发生任何变化,但当我运行脚本直到脚本完成时,之后金额值为 1000 +100+100 = 1200,而不是 1100。这是我的代码。

   public function actionIndex() 
{

    $connection = \Yii::$app->db;

    $transaction = $connection->beginTransaction();
    try 
    {
        $command = $connection->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1');

        $command->execute();

        $command = $connection->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1');
        $command->execute();

        $command = $connection->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1');
        $command->execute();

        $command = $connection->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1');
        $command->execute();
        sleep(10);

        $transaction->commit();
    }
    catch(Exception $e) 
    {
        $transaction->rollback();
    } 

我认为问题在于我的回滚未执行。任何帮助将不胜感激。

最佳答案

我认为问题与交易无关。尝试在有/没有交易的情况下执行代码并比较结果。 此外,我建议使用更简单的语法:

\Yii::$app->db->transaction(function(){

    \Yii::$app->db
        ->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1')
        ->execute();

    \Yii::$app->db
        ->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1')
        ->execute();

    \Yii::$app->db
        ->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1')
        ->execute();

    \Yii::$app->db
        ->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1')
        ->execute();

    sleep(10);
});

关于php - Yii2 事务 - 更新先前未提交的值加上新的提交值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39168193/

相关文章:

php - 使用 PHP 中的用户首选项更新帐户表

php - 使用自动增量 ID 插入和更新记录

php - 将多维php数组插入mysql表

mysql - 如何在时间列表中选择具体时间?

sql - 如何知道未提交的事务是否试图将特定的唯一键插入 SQL

Oracle:仅回滚循环的崩溃迭代

java - 计划任务中的 Spring 事务 - 分离实体错误

php - 向 MySQL 插入数据和从 MySQL 检索数据的安全方法

php - Laravel 家园

MySQL LIKE 带范围不起作用