开发记录:国标GB28181协议EasyGBS角色管理多次删除导致程序崩溃情况

我们对国标GB28181流媒体服务器EasyGBS做了新版调整,这段时间一直在进行测试。本栏目是对国标EasyGBS的开发过程中遇到的问题的记录。

开发记录:EasyGBS角色管理多次删除导致程序崩溃

EasyGBS新增了角色管理功能,管理员能够新建角色,同时也能够删除角色,每个角色都可以配置自己的设备。近期测试发现EasyGBS的角色删除功能偶尔报:当该角色下面有用户的时候,点击次数超过10次之后,程序会突然崩溃。

问题复现

首先我们新建角色Test01,并给新建的用户赋予他Test01的角色

开发记录:国标GB28181协议EasyGBS角色管理多次删除导致程序崩溃情况_第1张图片

在角色管理就能看到建立的此角色,随后我们点击删除角色,

开发记录:国标GB28181协议EasyGBS角色管理多次删除导致程序崩溃情况_第2张图片

此时整个页面刷新的时候都不能响应,程序在这时崩溃了。

问题分析

经过排查分析,是由于删除角色的时候开启了事务,但是再删除失败的时候事务没有释放。

                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
		}

	}

修改代码后,再次删除的时候点击页面程序,则不会出现崩溃情况,角色也能够顺利删除。

你可能感兴趣的:(EasyGBS)