如何从事务中排除某些阻止语句-Laravel 5.7

时间:2019-03-05 20:16:46

标签: laravel eloquent

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

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();

1 个答案:

答案 0 :(得分:1)

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

  

我需要将(查询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');)上,并且可能以其他方式我现在不考虑:)