laravel - 如何从事务中排除一些块语句 - 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();
解决方案
[编辑] 再次阅读您的问题后,似乎我可能误解了某些部分。如果说
我需要将(查询 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');
),并且可能以我现在不考虑的其他方式:)
推荐阅读
- python - 在python中连接wifi的最简单方法
- pandas-datareader - '使用 pandas-datareader 时出错:没有使用 'YahooDailyReader' 获取数据
- html - 在 Cpanel 中安装新字体
- assembly - MIPS 32 显示错误值并重复打印语句
- node.js - 如何在连接范围之外引用 socket.id 或以可以在连接范围之外引用的方式存储它?
- electron - 在具有上下文隔离的渲染器中使用电子保存对话框
- c# - 总偶数数组
- java - 在java中创建类对象而不使用类名方法的替代方法
- javascript - 如何获取数组中唯一值的*索引*
- ethereum - 从零地址发送交易