laravel + octane + swoole 偶发性 mysql事务 commit后没有写入数据库

1. 运行环境

1). 当前使用的 Laravel 版本?

Laravel Framework 11.44.2
//: <> (使用 php artisan --version 命令查看)

2). 当前使用的 php/php-fpm 版本?

PHP 版本:
PHP 8.2.22 (cli) (built: Sep 14 2024 14:25:13) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.22, Copyright (c) Zend Technologies
with Xdebug v3.2.0, Copyright (c) 2002-2022, by Derick Rethans

php-fpm 版本:

3). 当前系统

mac 和ubuntu 都有问题

2. 问题描述?

laravel + octane + swoole
在事务 里面insert 数据后, commit 也执行了
try catch 也包裹了, 最终接口返回了自增的id
但是马上去数据库看发现 数据并不存在
查看dblog 是有insert 语句的, 但是没有触发任何回滚事件的监听

3. 您期望得到的结果?

4. 您实际得到的结果?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

如果你不是用的闭包式事务 有可能其他地方的事务没有正常提交或者回滚 到时候这个时候下一个请求进到这一个work里面的时候 还在上一个未提交的事务里面 然后这个时候在开启事务 就是在当前事务下创建了一个Savepoint 然后只是把这个Savepoint提交了 但是事务还没真正的提交 所以能看到操作的日志记录 能看到自增id也变了

2天前 评论
Smilephp (楼主) 2天前
cccdz (作者) 2天前
讨论数量: 27

伪代码 ,catch 没有捕获到任何错误,最终发现数据没有插入进去
`
try{
DB::beginTransaction();
insert xxxx
DB::commit();

}catch(\Throwable $e){
DB::rollBack();
throw new Exceptions($->getMessage());
}
`

3天前 评论
springlee 3天前
Smilephp (作者) (楼主) 3天前

排除乌龙事件,怕不是进程执行sql的时候堵塞了,接收下一个链接导致的事务混乱了~

3天前 评论
Smilephp (楼主) 3天前
Imuyu (作者) 3天前
Smilephp (楼主) 3天前
Imuyu (作者) 2天前
Smilephp (楼主) 2天前
CodingHePing 2天前
Imuyu (作者) 2天前

如果你不是用的闭包式事务 有可能其他地方的事务没有正常提交或者回滚 到时候这个时候下一个请求进到这一个work里面的时候 还在上一个未提交的事务里面 然后这个时候在开启事务 就是在当前事务下创建了一个Savepoint 然后只是把这个Savepoint提交了 但是事务还没真正的提交 所以能看到操作的日志记录 能看到自增id也变了

2天前 评论
Smilephp (楼主) 2天前
cccdz (作者) 2天前

file

队列里面可能也存在这种情况 除了程序崩溃这种特殊情况外 忘记commit/rollback 或者异常捕获没有正确捕获 可以通过这种情况发现 去排查业务代码

2天前 评论
Smilephp (楼主) 2天前
cccdz (作者) 2天前
Smilephp (楼主) 2天前
cccdz (作者) 2天前
Smilephp (楼主) 2天前

后来怎么解决的?

2天前 评论
Smilephp (楼主) 2天前
Smilephp (楼主) 1天前

DB::transaction(function(){

}); //这样写

2天前 评论
不负岁月 2天前

一种是: DB::transaction(function(){ }); 另一种 try catch了 是否可以再finally下

5小时前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!