首页 > 解决方案 > 如何从事务中排除一些块语句 - Laravel 5.7

问题描述

我需要一些语句(存在于事务块中)在没有事务的情况下直接执行到数据库,例如:

DB::beginTransaction();

//query A : insert or update to some tables in transaction

//**I need some of the result of (query A) to be saved in Database without transaction**

//insert or update to some tables in transaction

DB::commit();

标签: laraveleloquent

解决方案


[编辑] 再次阅读您的问题后,似乎我可能误解了某些部分。如果说

我需要将(查询 A)的一些结果保存在没有事务的数据库中

您的意思是“在交易结束之前使用在交易中插入的值”,我想这是不可能的。您仍然可以使用我的答案即时插入或更新数据,但您将无法在事务结束之前读取您在事务中插入的内容。


您可以复制您用于事务的连接database.php。对于此示例,假设您调用它'mysql_outside_transaction'database.php在默认连接之后,文件中应该有类似的内容:

'mysql_outside_transaction' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

从那里,由于您有第二个连接到同一个可用数据库,您可以使用它来直接在事务中保存您需要的数据。

再次举个例子,如果你有一个 的实例$modelA,你可以告诉它使用你的第二个连接:$modelA->setConnection('mysql_outside_transaction');。从那里,源自此实例的每个数据库操作都将在您的事务之外完成(因为它将使用您配置的第二个连接,而不是用于事务的那个)。

不要忘记您可以将连接设置为以多种方式使用。它可以直接在模型类属性(protected $connection = 'your_connection';)上,带有DB外观(DB::connection('your_connection');),并且可能以我现在不考虑的其他方式:)


推荐阅读