1

如果发现死锁,我的目标是以正确的方式重新启动 InnoDB 事务,有时,对象中的数据在执行时发生更改,我需要将其回滚到以前的状态。为此,我可能会使用对象克隆,但我对此不确定 %100,因为这些对象没有__clone()定义方法,我没有时间添加它们。从另一方面来看,这些对象内部包含对象的情况非常罕见。

这是我的代码:

protected function callAction() {

    $action = $this->Method.'Action';

    // Storing an Object
    $SavedPackageObject = clone $this->PackageObject;

    try {

        // First attempt
        $res = $this->PackageObject->$action();

    } catch(MySQLiDeadlockException $e) {

        $i = 0;

        do {

            // Restoring an Object
            $this->PackageObject = clone $SavedPackageObject;

            try {

                $res = $this->PackageObject->$action();

                // Success    
                break;

            } catch(MySQLiDeadlockException $e) {

                // Cancel iterations if limit is reached
                if($i > 9)
                    throw $e;

                usleep(100000);

                $i++;

            }

        } while(1);

    }

    return $res;

}

对象复制还有另一种方法是深度克隆:

unserialize(serialize($Object));

我还考虑添加__clone()到所有这些包对象的父类:

// php.net example
function __clone(){ 
    foreach($this as $name => $value){ 
        if(gettype($value)=='object'){ 
            $this->$name= clone($this->$name); 
        } 
    } 
} 

问题:是否可以在父级中使用clone和定义__clone(),或者我可以序列化/反序列化?

4

1 回答 1

1

对于您正在做clone的事情,最有意义并且应该是最有效的。我想不出将您的对象序列化为字符串的任何好处,只是为了取消序列化它以重新获得它的状态。

我假设如果你必须覆盖,你必须覆盖和(取决于你的对象)如果序列化?_clone_sleep__wakeup

于 2013-01-31T02:52:32.060 回答