防止因事务未提交导致的死锁

这周事儿比较多,遇到了不少问题.其中比较严重的就是因为在处理一个比较大的数据导入时为了保持数据一致性使用了事务,但是却因为脚本执行超时或者内存超出限制,导致了事务中断,然后数据库直接deadlock.

事后想了下,如果在自己的框架里面遇到了这样的问题如何解决呢?

自己框架里的数据库连接对象是重载了pdo,直接想到在析构函数里面判断当前是否在一个事务里面,如果是则回滚.

public function __destruct() {
    if ($this->inTransaction()) {
        $this->rollBack();
    }
}

实际情况是超时或者内存超出限制时php直接产生一个致命错误,析构函数是不会被执行的.

所以可以使用register_shutdown_function在构造时手工将析构函数注册进来:

public function __construct() {
    register_shutdown_function(array($this, '__destruct'));
}

ps:注意正常情况下会导致析构函数被执行2次

标签: php, pdo, transaction, destruct, construct

添加新评论