【发布时间】:2019-06-06 07:45:31
【问题描述】:
现在已经 2 天了,我正在尝试解决一个问题,但仍然失败。感谢任何可以在此问题上提供帮助的人。
错误
我不断收到这条消息:Doctrine\DBAL\Driver\PDOException : SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT trans3 does not exist
一个动作有一个复杂的过程,我需要检查几个表。当它通过几个函数时,该过程会生成嵌套事务。
这不是我第一次使用事务,甚至是嵌套事务,到目前为止一切正常。只有这个函数会触发错误。
即使我从函数中删除 the DB::beginTransaction() 及其朋友,我仍然有错误。除了“trans3”变成“trans2”。
为了触发错误,我将函数代码简化为最简单的:
public function doStuff(Stuff $stuff, User $user)
{
$thing = Thing::where('user_id', $user->id)
->where('other_id', $stuff->id)
->get()
->first();
$thing->delete();
return false;
}
我已经尝试过的
- 如简化代码所示,删除 DB::beginTransaction 等 不能防止错误。
- 我还尝试在将属性从 true 更改为 false 后设置保存操作,
$thing->fill(['property' => false]); $thing->save();,同样的错误。如果属性没有从数据库中的内容更改,则没有错误(例如$thing->fill(['property' => true]); $thing->save();不会触发错误,因为没有触发更新)。 - 我试过用
DB::raw('raw SQL'),没区别。 - 我试过
DB::delete('RAW SQL');,没区别。
技术环境
Laravel 5.5
mysql Ver 15.1 Distrib 10.0.36-MariaDB,用于 debian-linux-gnu (x86_64),使用 readline 5.2
PHP 7.0.32-0ubuntu0.16.04.1
我现在想到的唯一解决方案是删除所有父代码中的所有事务。即使我忽略它所代表的危险,所需的时间也超出了范围,所以我想确保没有其他选择。
有没有人有任何想法,领导,任何东西?
感谢您的宝贵时间。
【问题讨论】:
-
您的代码在
doStuff()之前没有任何DB::beginTransaction()调用? -
是的,但我想保留它们,否则需要大量时间。
-
@Stéphane 你找到解决方案了吗?
-
@JonWhite 不,我实现了一个事务服务。我会写一个答案,但这不是修复,只是一种解决方法,我不喜欢它:/
标签: laravel-5 eloquent transactions