我有一些代码,并try 了两种方式.它没有按预期工作,也没有回滚数据

错误生成示例在GIT中:https://github.com/Namvarii/laravel-db-transaction-error

\DB::beginTransaction();

try {
    $order = Order::create([
        // data
    ]);

    $order->notes()->create([
        // data and cause a fail
    ]);

    // No morph map defined for model [App\Models\Order].

    $order->transaction()->create([
        // data
    ]);

} catch (\Exception $e) {
    \DB::rollBack();
    return "error";
}

\DB::commit();

return "success";

\DB::transaction(function() use ($offer, $request) {
    $buyer = auth()->user();

    $order = Order::create([
        // data
    ]);

    $order->notes()->create([
        // data
    ]);

    // throw error, "No morph map defined for model [App\Models\Order]" because not alias is defined.

    $order->transaction()->create([
        // data
    ]);
});

return "success";

在这两个示例中,出现了变形别名错误,请求失败,并显示消息No morph map defined for model [App\Models\Order],但我想知道为什么Order::create([/* data */]);没有回滚并存储在数据库中.


update: Default laravel DB engine is null and my DB using MyIsam. 和 problem is that. thanks for answer @P.K.Tharindu

推荐答案

当您在事务中创建模型及其关系时,如果发生异常,Laravel应该自动回滚整个事务,undo撤消在该事务中所做的任何更改.However, the underlying database engine has to support transactions for Laravel's transactional behavior to be effective.

例如,InnoDB,一个在Laravel应用程序中经常与MySQL一起使用的存储引擎,完全支持事务并遵守ACID属性.InnoDB确保在发生异常或错误时,事务中所做的任何更改都能可靠地回滚,防止部分或不一致的数据在数据库中持久化.

相反,某些存储引擎,如MyISAM, lack native support for transactions.在这种情况下,Laravel的交易功能可能不会像预期的那样运行.

Mysql相关问答推荐

MySQL 8.0.28覆盖(和函数)索引未使用

如何有效地计算共同的朋友/追随者?

SQL计算不同的列并返回所有行

使用由其中一个表的列规定的条件连接两个表

错误:数据包顺序错误.GET:0预期:10 node JS MySQL

SQL/Pyspark -判断条件

在 .NET 6 中使用 Dapper Framework 未能成功连接到 MySql

根据时间戳分组删除

错误:此查询集包含对外部查询的引用,并且只能在子查询中使用

使用mysql查询获取不关注user1的user3

如何本地化 MySQL 表中的实体?

如何在每个国家/地区查询 GHTorrent(类 SQL 语言)的最常用语言

MYSQL 或 Laravel Eloquent 如何从这个订单中统计细节

Over() 函数不覆盖表中的所有行

提高mysql导入速度

从mysql中的大表中快速 Select 随机行

Sequelize:销毁/删除表中的所有记录

mysql错误'TYPE = MyISAM'

将 UTF8 表上的 latin1 字符转换为 UTF8

为什么在 MySQL 中使用外键约束?