JSP+Servlet培训班作业管理系统[15] -事务的使用时机(以新增作业为例)

来源:互联网 发布:windows更新安装失败 编辑:程序博客网 时间:2024/05/16 00:49

猫哥最近已基本实现了JSP+Servlet培训班作业管理系统校长、教师拥有的功能。但是一直没有什么功能是有新意的、可讲的,直到Today,猫哥发现一个非常经典的场景——数据库事务的使用场景,那就是教师发布作业,这就是一个必须(不得不)采用事务的简单场景,本篇讲述该如何设计实现。

首先必须先了解下表结构:
这里写图片描述
简单描述下:

1,system_user:用户表,需要注意user_role对应system_role的id,system_role共三种角色:校长、教师、学生2,system_course:课程表,只有教师能发布课程3,system_work:作业表,只有教师能发布课程对应的作业,也就是说一门课程可以发布多次作业4,student_lesson:学生选课表,注意lesson_user是学生user_id,而lesson_course是课程course_id5,student_job:是学生作业表,此处逻辑非常重要。如果一门课程已发布3次作业,学生选课时是看不到本门课之前发布的3次作业的(猫哥培训学校不流行补交作业,执行随到随学),学生只有选课后,才能看到教师发布的作业,才能去完成这些作业。

通过以上讨论,想必大家也明白了规则。那么重点来了,教师在发布作业,也就是教师在system_work中新增一条记录时,数据库需要做什么变化?

首先,在system_work中新增一条记录,需要注意的是作业都是归属课程的,所以新增作业时需要选定新增作业所属课程,示意图如下。
这里写图片描述

然后,需要根据student_lesson中学生已选课程的信息,在student_job中为选择作业所属课程的每名学生新增一条作业,这样每当教师发布作业后,选课了的学生接着就能看到一个自己还没做的作业

好的,也就是说,在教师点击新增作业界面的确定按钮后,需要在system_work添加一条记录,同时需要在student_job中添加若干条记录(最少是0条,最多也不超过学生总人数,其实就是选课了的学生人数)。这两个操作必须同时成立,所以必须采用事务。

那么,为啥说必须使用事务呢,此处采用反证法证明:

1,如果不采用事务,则在多条sql先后执行时,由于数据库异常(最好理解的比如数据库所在设备停电了),则可能有些sql语句执行成功,有些失败了。2,在此情景中,如果system_work表已添加成功一条记录,而student_job中添加记录失败。则教师看到作业列表中存在这次的作业,但是学生却看不到。3,这种情景属于错误,所以必须使用事务。

好的,那么Java中如何实现事务呢,此处给出一个最简单的模版如下:

try{//第一步,将需要执行的语句放在try catch中以便捕获异常            //第二步,获取一个数据库连接,用于和数据库交互            if(conn==null)//未分配                conn=MySQLPool.getConnecton();//用时从池中取,很爽快            //第三步,开始事务后不让mysql自动提交了,程序员做主何时一起提交或者还是回退            conn.setAutoCommit(false);               //第四步,执行一系列的sql操作            for(String sql:sqlList){                stmt=conn.createStatement();                stmt.executeUpdate(sql);            }            //此处提交事务,如果中间所有执行语句没错,则全部一起执行            conn.commit();        }        catch (Exception ex) {            try {                //如果有错误,则回滚到所有sql未执行状态                conn.rollback();            } catch (SQLException sqlEx) {                new MyException(new Date(),sqlEx.getMessage(),"事务回滚错误");            }              throw new MyException(new Date(),ex.getMessage(),"数据库执行错误");        }finally{//其他事情            MySQLPool.release(conn);//用完归还        }        return true;       

下篇将给出新增作业功能具体的代码实现

0 0
原创粉丝点击