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. 您实际得到的结果?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

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

1个月前 评论
Smilephp (楼主) 1个月前
cccdz (作者) 1个月前
讨论数量: 31

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

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

1个月前 评论
springlee 1个月前
Smilephp (作者) (楼主) 1个月前
哪吒的狗腿子 1个月前

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

1个月前 评论
Smilephp (楼主) 1个月前
Imuyu (作者) 1个月前
Smilephp (楼主) 1个月前
Imuyu (作者) 1个月前
Smilephp (楼主) 1个月前
CodingHePing 1个月前
Imuyu (作者) 1个月前

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

1个月前 评论
Smilephp (楼主) 1个月前
cccdz (作者) 1个月前

file

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

1个月前 评论
Smilephp (楼主) 1个月前
cccdz (作者) 1个月前
Smilephp (楼主) 1个月前
cccdz (作者) 1个月前
Smilephp (楼主) 1个月前

后来怎么解决的?

1个月前 评论
Smilephp (楼主) 1个月前
Smilephp (楼主) 1个月前

DB::transaction(function(){

}); //这样写

1个月前 评论
不负岁月 1个月前

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

1个月前 评论

DB::beginTransaction();不是应该放在try外面吗。。

1个月前 评论

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