1.发现问题
(1)功能实现逻辑
添加一个新的系统的时候
①先添加系统本身,即名称,地址,简介,将这些存入system表,得到system_id
②添加系统所处的服务器(由于有专门的添加服务器功能,所以这里的服务器只用填地址,如果地址对应服务器不存在,就会提示:该服务器不存在,请先添加服务器),根据服务器地址找到server_id,然后将system_id和server_id存到系统服务器的关联表system_server中
③将管理账号根据system_id存入account表中
如果一切顺利,那就可以成功添加系统
(2)在以下场景时出现问题
如果在2中,用户输入了一个不存在的服务器地址,填完所有信息后一提交,那后端就会完成步骤1和部分步骤2,即创建了系统,也将系统部署到一部分服务器上了,但在遇到了这个不存在的服务器后,return错误信息,那用户在看到错误信息---该服务器不存在后进行修改服务器地址,再点提交,这个时候系统已经存在表中了,那就会添加失败,提示系统已存在,那这个对用户来说是很不合理的反馈,应该怎么解决呢?
---controller初始代码
2.解决方法
(1)保证不会出现上述场景
即对前端的逻辑进行修改,用户在添加系统所处服务器时,不是自己随便输入服务器地址,而是使用下拉选框的形式,用户只能从已有的服务器中选择,保证了服务器的存在,可以让这个系统成功顺利的添加
(2)在出现以上场景时正确处理
这里使用的是jFinal框架,它提供了封装好的事务回滚功能:Db.tx()
①基本逻辑
在存入数据库时如果需要一次插入多条数据,就要用到事务,即一旦这一批插入中出现错误,那就会回滚事务,不存在插入了一部分还有一部分没有插入的情况。
Db.tx()会返回布尔类型,return false或者有异常抛出都会自动回滚事务,return true才会提交事务
②基本用法
开发文档中的演示
PS:最开始没有看开发文档,直接百度的,结果啥都不懂,在controller层写的Db.tx(),一点效果都没有...,看了文档之后才搞明白是要在service层写,然后就在service层集中写了addSystem(String list)方法,list就是前端传的JSON字符串,最终效果挺好的
③具体应用
---server层
---controller层
3.最终效果
成功实现了添加系统这个过程的完整一致性,不存在系统添加了但是添加服务器关联失败这样的情况了。这种表单的提交在现实中应用也是很广泛的,所以不能全靠前端逻辑设计来保证功能不会出错,事务,我记住你了哈哈哈