你如何在我的Zend 2代码中处理数据库事务?

时间:2014-12-30 11:30:13

标签: transactions zend-framework2

这是我的模型中的代码:

namespace Application\Model;

use Zend\Db\Adapter\Adapter;
use Zend\Db\TableGateway\AbstractTableGateway;

class UsersTable extends AbstractTableGateway {

    public function __construct(Adapter $adapter) {
        $this->adapter = $adapter;
    }

    public function fetchAll() {

        $results = $this->adapter->query("SELECT * FROM users");
        $results = $results->execute();
        return $results->current();

    }
    public function insertNewUser($new_user_data){
        $ip = $_SERVER['REMOTE_ADDR'];
        try {
            $x = $this->adapter->getDriver()->getConnection()->beginTransaction();
            var_dump($x);

            $insert =   $this->adapter->query("INSERT INTO users (username,`name`,email,`password`, birthday,country,city,address,website,img_url,`date`,`update`,ip,email_confirm,`status`) values ('".$new_user_data['username']."','".$new_user_data['name']."','".$new_user_data['mail']."','".md5($new_user_data['password'])."','".$new_user_data['birthday']."','".$new_user_data['country']."','".$new_user_data['city']."','".$new_user_data['address']."','".$new_user_data['website']."','".$new_user_data['user_picture']."',NOW(),
                NOW(),'".$ip."','0','normal')");
            $insert->execute();

            $x = $this->adapter->getDriver()->getConnection()->commit();

        } catch (Exception $e) {
            $this->adapter->getDriver()->getConnection()->rollback();
            echo "Failed: " . $e->getMessage(); 
        }

    }

}

插入查询它工作正常并执行。但是var_dump($ x)的结果是null。为什么?以及如何测试它以确保它有效?因为我没有错误或警告。

1 个答案:

答案 0 :(得分:0)

如果$ x为null,这不是什么大问题,因为ConnectionInterface :: beginTransaction()方法应该返回Connection本身($ this),它被称为fluent interface

事实是并非所有驱动程序都能正确实现它。例如,在Mysqli和Pgsql中,该方法没有返回。

我不确定在这里使用事务是否相关...你有一个插入,所以如果失败则不需要回滚任何内容?

当您希望多个数据库更改为原子时,事务很有用(其中一个更改中的任何错误都将回滚整个更改)。