在mysql中,使用php和curl可以通过多个连接进行事务处理吗

在mysql中,使用php和curl可以通过多个连接进行事务处理吗,php,mysql,transactions,Php,Mysql,Transactions,我的任务是创建一些API的集成测试,我想知道是否可以做一些事情,比如开始一个事务;curl几个api调用;回滚数据库 示例伪代码 begin_long_transaction(); $userId = (new CURL('user/create', $dataArr))->post(); (new CURL("user/$userId", $updateDataArr))->put(); $userData = (new CURL("user/$userId"))->get(

我的任务是创建一些API的集成测试,我想知道是否可以做一些事情,比如开始一个事务;curl几个api调用;回滚数据库

示例伪代码

begin_long_transaction();
$userId = (new CURL('user/create', $dataArr))->post();
(new CURL("user/$userId", $updateDataArr))->put();
$userData = (new CURL("user/$userId"))->get();

// assert userData is as expected
rollback_long_transaction();

看起来您正在使用CURL访问网络中其他地方实现的服务,该服务由具有自己的MySQL数据库连接池的服务实现

所以,你的问题的答案是否定的

下面是来自另一个SO问题的更多信息


是的,这是可能的。 通常,您会对此进行模拟,但也可以进行实时API测试。 您使用的是PHP,因此选择的工具是phpUnit

如果您使用phpUnit,我建议您扩展phpUnit_框架_测试用例或phpUnit_扩展_数据库_测试用例,并使用beginLongTransaction和rollbackLongTransaction以及api方法构建一个自定义类

让我们假设像request$type、$url、$data这样的东西,这样您就不必经常键入新的Curl$这->请求'GET',/somewhere',$data

在测试用例之前和之后,还可以进行设置和拆卸

注意超时&相应地设置PHP执行时间,因为由于依赖于外部API,一些测试可能会遇到连接超时。 您还可以将测试分组并单独运行,以避免超时

class MyApiTest1 extends MyCustomAPI_PHPUnit_Framework_TestCase
{
    // connection per test
    public function testSomething()
    {
        $this->useConnection($connectionName);

        $result = $this->request('GET', '/user/' . $this->getDb()->getUsername());

        $this->assertEquals(200, $result->getResponse()->getStatusCode());

        $this->closeConnection($connectionName);
    }
}

class MyApiTest2 extends MyCustomAPI_PHPUnit_Framework_TestCase
{
    public function setUp()
    {
        $this->useConnection($connectionName);
    }

    // connection per class
    public function testSomething()
    {
        $result = $this->request('GET', '/test');

        $this->assertEquals(200, $result->getResponse()->getStatusCode());
    }

    public function tearDown()
    {
         $this->closeConnection($connectionName);
    }
}
用于处理多个db连接和一个请求方法的基类:

class MyCustomAPI_PHPUnit_Framework_TestCase extends PHPUnit_Framework_TestCase
{
    static public $dbConnections = array();

    function setupConnections()
    {
        // foreach array(databaseName => credentials)
        {
           // create connection object
           // store connection object into array
           self::$dbConnections[$databaseName] = $connection;
        }
    }

    function getConnection($connectionName)
    {
        return self::$dbConnections[$connectionName];
    }

    function rollback($connectionName)
    {
        $con = $this->getConnection($connectionName);

        // rollback hard
        $con->deleteDatabase();
        $con->insertDatabaseSchema();
        $con->insertDatabaseData();

        // = database @fresh start
    }

    function beginTransaction($connectionName)
    {
        $con = $this->getConnection($connectionName);

        // do stuff on begin

        return $con;
    }

    function request($type, $url, $data)
    {
        // do curl request

        return $cURLdata;
    }

}

那么,启用持久连接,然后在头中指定的第一个请求中序列化连接,或者在第一个api调用中重写destroy,这样当脚本结束时,连接不会关闭,并且每个中间脚本将重复使用连接,直到最后一个将回滚它的连接为止,怎么样?仅供参考:在测试期间不会使用其他任何东西。在设置中启动事务不会自然影响curl请求,因为这将是一个单独的过程。我不确定我是否遵守了我不确定你的意思。我会将连接设置为静态私有连接。这将使它在所有后续测试中保持打开状态。您可能想查看phpUnit手册的数据库一章,我已经为这些测试添加了一些基本的测试示例和基类。基类只是一个快速草案,包含一些伪代码元素。我希望这能更好地解释这一点。