我们对国标GB28181流媒体服务器EasyGBS做了新版调整,这段时间一直在进行测试。本栏目是对国标EasyGBS的开发过程中遇到的问题的记录。
开发记录:EasyGBS角色管理多次删除导致程序崩溃
EasyGBS新增了角色管理功能,管理员能够新建角色,同时也能够删除角色,每个角色都可以配置自己的设备。近期测试发现EasyGBS的角色删除功能偶尔报:当该角色下面有用户的时候,点击次数超过10次之后,程序会突然崩溃。
首先我们新建角色Test01,并给新建的用户赋予他Test01的角色
在角色管理就能看到建立的此角色,随后我们点击删除角色,
此时整个页面刷新的时候都不能响应,程序在这时崩溃了。
经过排查分析,是由于删除角色的时候开启了事务,但是再删除失败的时候事务没有释放。
tx := dbclient.Begin()
for _, v := range roleid_arr {
if v == adminRoleModer.ID {
c.IndentedJSON(400, "没有权限操作")
return
}
var tempcount = 0
dbclient.Where("rid = ?", v).First(&models.UserRole{}).Count(&tempcount)
if tempcount > 0 {
c.IndentedJSON(400, "该角色下面有用户")
return
}
}
在失败的时候添加事务回滚tx.Rollback(),参考代码如下:
tx := dbclient.Begin()
for _, v := range roleid_arr {
if v == adminRoleModer.ID {
tx.Rollback()
c.IndentedJSON(400, "没有权限操作")
return
}
var tempcount = 0
dbclient.Where("rid = ?", v).First(&models.UserRole{}).Count(&tempcount)
if tempcount > 0 {
tx.Rollback()
c.IndentedJSON(400, "该角色下面有用户")
return
}
}
修改代码后,再次删除的时候点击页面程序,则不会出现崩溃情况,角色也能够顺利删除。