Laravel-插入DB :: Rollback独特的钥匙预防



我的表列 entry_id 列设置为unique ...

是否有使用尝试&捕获和DB ::回滚以修改我的变量?例如:

$_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 不是唯一的,我可以使用回滚方法输入 吗?这是正确的方式吗?

谢谢!

我认为在您的情况下,最好使用封闭。

DB::transaction(function() use ($entryId)
{
    $sub = Submission::create([
        'entry_id' => $entryId,
    ]);
});

您可以将查询链接在封闭中,如果任何时候失败,它将自动运行回滚。

检查您的表是否引擎= myisam

并将其更改为Innodb

在Laravel Open 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'),
        ]) : [],
    ],
],

在那个新鲜的迁移之后要更改数据库中的引擎

最新更新