Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open transactions must be committed or rolled back, otherwise it will affect other requests. 打开的事务必须提交或回滚,否则会影响其他请求。 #161

Closed
cheerego opened this issue Jul 2, 2019 · 12 comments
Labels
question Further information is requested

Comments

@cheerego
Copy link

cheerego commented Jul 2, 2019

  1. Tell us your software version

    Software Version
    PHP 7.2.19
    Swoole 4.3.5
    Laravel/Lumen 5.4.*
  2. Detail description about this issue(error/log)

image

将公司项目从迁移到swoole后,就会报这个错。最后没有办法,切回的fpm这个问题就没有了。

  1. Give us a reproducible code block and steps

    //TODO: Your code
@hhxsv5
Copy link
Owner

hhxsv5 commented Jul 2, 2019

数据库连接是单例,请检查是否有开启的事务,没有被提交或回滚。

// 手动管理事务
try {
    DB::beginTransaction();

    DB::doSomeInsertOrUpdate();
    if (someCondition) {
        // 这里会造成事务没有Commit,应在return前加上Commit或Rollback
        return;
    }

    DB::commit();
} catch(\Throwable $e){
    DB::rollback();
    throw $e;
}

// 自动管理事务
// 推荐写法,避免手动管理遗漏Commit或Rollback
DB::transaction(function() {
    DB::doSomeInsertOrUpdate();
    if (someCondition) {
        // 不会出问题,因为DB::transaction()自动管理事务,会在return前Commit,一旦有异常就Rollback
        return;
    }
});

@hhxsv5 hhxsv5 added the question Further information is requested label Jul 2, 2019
@cheerego
Copy link
Author

cheerego commented Jul 2, 2019

@hhxsv5 检查过,不存在没有commit或者rollback 的情况

@liulianjun1995
Copy link

我之前也有这个错误 就是因为事务没有提交或回滚

@cheerego
Copy link
Author

cheerego commented Jul 2, 2019

@liulianjun1995 我的php-fpm 运行没有这个问题。你也是这样吗?

@cheerego cheerego closed this as completed Jul 4, 2019
@xeonselina
Copy link

经过我们检查,的确是因为事务没有commit和回滚,而是函数直接return了导致的

@hhxsv5
Copy link
Owner

hhxsv5 commented Jul 9, 2019

@xeonselina 可以提供下错误的示例,便于其他人发现问题。

@xeonselina
Copy link

xeonselina commented Jul 9, 2019

我们出错的代码类似于这样

DB::beginTransaction();

try{
  if($userIsNotValid){
    return false;
  }
  DB::doSomeInsertOrUpdate();
  DB::commit();
}
catch(\Exception $e){
  DB::rollback();
  throw $e;
}

这里的return语句会导致transaction没被释放,进而有的锁可能会不释放
mysql中锁是在事务释放后才释放的

@longerhot
Copy link

数据库连接是单例,请检查是否有开启的事务 没有被提交或回滚。

数据库操作中目前发现一个问题:
用户A 发生如

DB::beginTransaction();
try{
  if($userIsNotValid){
    return false;
  }
  DB::doSomeInsertOrUpdate();
  DB::commit();
}
catch(\Exception $e){
  DB::rollback();
  throw $e;
}

此时数据库事务锁住了,
用户B,C,D等提交事务,对于他们来讲,数据显示正常,数据库的ID也占用了,但是没有真实提交到数据库。

如果重启laravelS服务, 此时 B,C,D的数据会丢失

请问改怎么解决
@hhxsv5 @cheerego

@cheerego
Copy link
Author

DB::beginTransaction();
try{
  if($userIsNotValid){
   DB::rollback(); 
    return false;
  }
  DB::doSomeInsertOrUpdate();
  DB::commit();
}
catch(\Exception $e){
  DB::rollback();
  throw $e;
}

在 if 的里面

@August2012

@longerhot
Copy link

DB::beginTransaction();
try{
  if($userIsNotValid){
   DB::rollback(); 
    return false;
  }
  DB::doSomeInsertOrUpdate();
  DB::commit();
}
catch(\Exception $e){
  DB::rollback();
  throw $e;
}

在 if 的里面

@August2012

恩恩,谢谢,您说的这种处理是没问题的。

就想请教下,如果发生了这种情况(比如开发代码考虑不周等情况)。没有走到rollback, 数据库死锁。
该如何操作才能不造成数据丢失。
我们遇到情况: 重启服务,系统回复正常,数据丢失; 不重启服务,数据库 go away 宕机~
不知道有没有办法隔离~

@L-Y
Copy link

L-Y commented Feb 28, 2020

DB::beginTransaction();
try{
  if($userIsNotValid){
   DB::rollback(); 
    return false;
  }
  DB::doSomeInsertOrUpdate();
  DB::commit();
}
catch(\Exception $e){
  DB::rollback();
  throw $e;
}

在 if 的里面
@August2012

恩恩,谢谢,您说的这种处理是没问题的。

就想请教下,如果发生了这种情况(比如开发代码考虑不周等情况)。没有走到rollback, 数据库死锁。
该如何操作才能不造成数据丢失。
我们遇到情况: 重启服务,系统回复正常,数据丢失; 不重启服务,数据库 go away 宕机~
不知道有没有办法隔离~

我也遇到数据丢失的问题

@hhxsv5 hhxsv5 changed the title 项目使用LaravelS后,数据库的事物会锁住,而php-fpm没有问题 Open transactions must be committed or rolled back, otherwise it will affect other requests. 打开的事务必须提交或回滚,否则会影响其他请求。 Feb 29, 2020
@hhxsv5 hhxsv5 pinned this issue Feb 29, 2020
@tai1030
Copy link

tai1030 commented Jun 23, 2020

#270 - Add “server_timeout” parameter for detect server-side timeout.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

7 participants