【问题标题】:Yii transaction where to start itYii 事务从哪里开始
【发布时间】:2015-12-09 22:28:36
【问题描述】:

我想知道从哪里开始交易是否重要。

示例 1:

            $transaction = Yii::app()->db->beginTransaction();
            try
            {
                $savedSuccessfully = $object->save();
                $transaction->commit();
            }
            catch (Exception $ex)
            {

                $transaction->rollBack();
                $result = $e->getMessage();                    
            }

示例 2:

            $transaction = Yii::app()->db->beginTransaction();
            try
            {
                $object = $model()::model()->findByPk(1); //!!!!!!! - line
             //   what makes the difference
                $savedSuccessfully = $object->save();
                $transaction->commit();
            }
            catch (Exception $ex)
            {

                $transaction->rollBack();
                $result = $e->getMessage();                    
            }

应该在从数据库中选择数据之前还是在更新/插入数据之前启动事务? yii 会代替我来处理它吗?

谢谢

【问题讨论】:

  • 你如何初始化你的 $transaction 对象?
  • 啊,我忘记了最重要的部分。已添加
  • 这将开始你的交易
  • 事务开始时模型有旧数据怎么办?
  • 在开始和结束事务之间执行的每个查询都将全部提交或回滚

标签: php mysql yii transactions


【解决方案1】:

示例 2 将是首选解决方案。

通过在事务中检索模型,您可以确保它在整个更改过程中保持一致。

如果您在事务之外检索模型(如示例 1 中所示),其他线程/用户可能会在您提交更改之前更改相应的数据库条目。因此,您最终可能会得到可能不一致的数据。

【讨论】:

  • 我也感觉到了。但我找不到任何说明第二种方式是首选的 yii 文档。这只是我的猜测。如果 yii 会检查数据是否与当前模型对应,并以这种方式确保使用第一种方法是安全的呢?
【解决方案2】:

实际上第二个是正确的,如果您要保存更重要的数据,例如银行交易或支付系统,那么示例 2 是非常正确的方法。例如,你正在做一些这样的代码。

insert into table 1
select from table 1
insert into table 2
update table 2 
select from table 1.

因此,如果您从 first 开始事务,如果任何查询失败,它将回滚所有查询,这将更有效。例如在线支付系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多