我的表格列 entry_id 列设置为唯一...
有没有最好的方法来使用try& catch和DB :: rollback来修改我的变量?例如:
$_id = 1
$entryId = 'test0000'+$_id;
DB::beginTransaction();
try {
$sub = Submission::create([
'entry_id' => $entryId,
]);
DB::commit();
// success insert..
} catch (\Exception $e) {
DB::rollback();
//detected unique... just ++ _id to ensure not unique
$_id++;
// throw $e;
} catch (\Throwable $e) {
DB::rollback();
//detected unique... just ++ _id to ensure not unique
$_id++;
// throw $e;
}
第一次没有错误,我可能第二次知道,为了确保 entry_id 不唯一,我可以使用回滚方法输入++吗?这是正确的方法吗?
谢谢!
答案 0 :(得分:0)
我认为在你的情况下最好使用一个闭包。
DB::transaction(function() use ($entryId)
{
$sub = Submission::create([
'entry_id' => $entryId,
]);
});
您可以在闭包内链接查询,如果它在任何时候都失败,它将自动运行回滚。
答案 1 :(得分:0)
检查您的表引擎是否=MyISAM
并将其更改为 InnoDB
在 Laravel 中打开 config/database.php 在 mysql 设置引擎中 => 'InnoDB'
'connections' => [
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'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' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => "InnoDB",
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
],
在那之后重新迁移 更改数据库中的引擎