如果发现死锁,我的目标是以正确的方式重启InnoDB事务,有时,对象中的数据会在执行时发生变化,我需要将其恢复到以前的状态。为此,我可能会使用对象克隆,但我不确定它,因为这些对象没有定义__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()
,或者我可以序列化/反序列化吗?
答案 0 :(得分:1)
对于你正在做的事情,clone
最有意义,应该是最有效的。我想不出将对象序列化为字符串的任何好处,只是为了反序列化它以重新获得它的状态。
我认为如果您必须覆盖_clone
,则必须覆盖
_sleep
和__wakeup
(取决于你的对象)如果序列化?