我需要一些语句(在事务块中存在)才能直接执行到没有事务的数据库,例如:
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();
答案 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');
)上,并且可能以其他方式我现在不考虑:)