首页 > 代码库 > 机房收费系统中“事务”的应用

机房收费系统中“事务”的应用

    做机房收费系统已经接近尾声了,随着系统业务的完善、对各个过程功能要求的提高,对代码的要求就变的愈加苛刻,很多时候实现一个功能需要对数据库中很多的表进行操作,而这些操作都是在这个功能实现了的前提之下才应该去执行的,所以,如果我们单纯地实现功能,而不去考虑他们之间的因果关系,就会出现在某一个功能中部分操作完成了而其他的操作由于由于终端并没有完成,最终,就会对我们的数据造成破坏,使系统的性能大大降低,严格地说,这样的系统是失败的、不合格的。举例来说,如果你在存钱的时候由于供电影响系统终止,而你已经把钱存到了ATM机中,银行系统中却并没有更新你的数据,这样的损失是你我都不想看到的。

    以下就是自己在做操作两个数据表的时候由于中间出错而导致只执行了第一个操作,效果就是第一个数据表插入了新的数据,而与之对应的第二个数据表中却并没有更新:




    ”功能都是随着需求而来的“,正是由于有这样的情况出现,所以才有了事务的出现,接下来,我将介绍一下事务:

一、应用背景

    上边的例子已经很好地说明了事务应用的背景,在此不再赘述。

二、应用实例

    以下是自己针对某一功能添加了事务之后的效果,D层代码:

<span style="font-family:KaiTi_GB2312;font-size:18px;"> ''' <summary>
    ''' 注册学生信息(应用事务)
    ''' </summary>
    ''' <param name="enUpdateStu"></param>
    ''' <param name="enUpdateCard"></param>
    ''' <remarks></remarks>
    Public Sub Register(ByVal enUpdateStu As Entity.students, ByVal enUpdateCard As Entity.card, ByVal enUpdateChargeRec As Entity.ChargeRecord)

        Dim strconnection As String = "server=zhanghui-pc;database=charge-SYS;user id=sa;password=*****"
        Dim conn As SqlConnection = New SqlConnection(strconnection)
        Dim cmd As New SqlCommand

        Using (conn)
            conn.Open()
            '开启事务
            Dim transaction As SqlTransaction
            transaction = conn.BeginTransaction()

            cmd.Transaction = transaction
            cmd.Connection = conn

            Try
                '-------更新学生信息(事务一)---------------------------
                Dim sqlstr1 As String = "insert into T_students (stuID,stuName,stuSex,stuMajor,stuGrade,stuClass,cardNO," +
                            "explain) values (@stuID,@stuName,@stuSex," +
                            "@stuMajor,@stuGrade,@stuClass,@cardNO,@explain)"

                Dim commandtype1 As New CommandType
                Dim parameter1 As SqlParameter()

                parameter1 = {New SqlParameter("@stuID", enUpdateStu.stuID),
                             New SqlParameter("@stuName", enUpdateStu.stuName),
                             New SqlParameter("@stuSex", enUpdateStu.stuSex),
                             New SqlParameter("@stuMajor", enUpdateStu.stuMajor),
                             New SqlParameter("@stuGrade", enUpdateStu.stuGrade),
                             New SqlParameter("@stuClass", enUpdateStu.stuClass),
                             New SqlParameter("@cardNO", enUpdateStu.cardNO),
                             New SqlParameter("@explain", enUpdateStu.explain)
                             }


                cmd.Parameters.AddRange(parameter1)
                cmd.CommandType = commandtype1
                cmd.Connection = conn
                cmd.CommandText = sqlstr1

                cmd.ExecuteNonQuery()

                '--------------更新卡信息(事务二)------------------------------------------------------------
                Dim sqlstr2 As String = "insert into T_card (cardNO,stuID,registerDate,registerTime,registerWorker,cash,status) " +
                                "values (@cardNO2,@stuID2,@registerDate,@registerTime,@registerWorker,@cash2,@status2) "
                Dim commandtype2 As New CommandType
                Dim parameter2 As SqlParameter()

                parameter2 = {New SqlParameter("@cardNO2", enUpdateCard.cardNO),
                             New SqlParameter("@stuID2", enUpdateCard.stuID),
                             New SqlParameter("@registerDate", (Format(Now(), "yyyy/MM/dd"))),
                             New SqlParameter("@registerTime", (Format(Now(), "hh:mm:ss"))),
                             New SqlParameter("@registerWorker", enUpdateCard.registerWorker),
                             New SqlParameter("@cash2", enUpdateCard.cash),
                             New SqlParameter("@status2", enUpdateCard.Status)
                             }

                cmd.Parameters.AddRange(parameter2)
                cmd.CommandType = commandtype2
                cmd.Connection = conn
                cmd.CommandText = sqlstr2


                cmd.ExecuteNonQuery()
                '------------------------更新充值记录信息(事务三)-------------------------------------
                Dim sqlstr3 As String = "insert into T_chargeRecord (cardNO,chargeMoney,chargeDate,chargeTime,userID,status)" +
                                    "values (@cardNO3,@chargeMoney,@chargeDate,@chargeTime,@userid,@status3)"
                Dim commandtype3 As New CommandType
                Dim parameter3 As SqlParameter()

                parameter3 = {New SqlParameter("@cardNO3", enUpdateChargeRec.cardNO),
                              New SqlParameter("@chargeMoney", enUpdateChargeRec.chargeMoney),
                              New SqlParameter("@chargeDate", enUpdateChargeRec.chargeDate),
                              New SqlParameter("@chargeTime", enUpdateChargeRec.chargeTime),
                              New SqlParameter("@userid", enUpdateChargeRec.userID),
                              New SqlParameter("@status3", enUpdateChargeRec.status)
                            }

                cmd.Parameters.AddRange(parameter3)
                cmd.CommandType = commandtype3
                cmd.Connection = conn
                cmd.CommandText = sqlstr2

                cmd.ExecuteNonQuery()


                '提交事务
                transaction.Commit()

                cmd.Parameters.Clear()

            Catch ex As Exception
                '事务回滚
                transaction.Rollback()
            End Try
        End Using

    End Sub</span>
B层代码,去调用D层

<span style="font-family:KaiTi_GB2312;font-size:18px;"> ''' <summary>
    ''' 学生注册(事务)
    ''' </summary>
    ''' <remarks></remarks>
    Public Function RegisterB(ByVal enUpdateStu As Entity.students, ByVal enUpdateCard As Entity.card, ByVal enUpdateChargeRec As Entity.ChargeRecord) As Boolean
        Dim RegisterD As New DAL.RegisterDAL
        RegisterD.Register(enUpdateStu, enUpdateCard, enUpdateChargeRec)
        Try
            Return True
        Catch ex As Exception
            MsgBox(ex.Message)
            Return False
        End Try

    End Function</span>
U层代码,调用B层

<span style="font-family:KaiTi_GB2312;font-size:18px;"> Dim RegisterB As New BLL.RegisterBLL
        RegisterB.RegisterB(entityReg, entityRegCard, entityChargeRec)
        MsgBox("注册成功!", vbOKOnly, "恭喜")
        txtChargeValue.Text = txtValue.Text.Trim</span>
三、性质(ACID)

1.解决了一个功能多个操作中不能全部进行的问题,也就是它的的原子性;

2.使数据库中各个表保持一致,也就是它的一致性;

3.多个事务并发执行会时,系统保证与这些事务先后单独执行时的结果一样,达到了隔离性的要求;

4.操作完成后,它对数据库的所有更新会永久地反映在数据库中,不会丢失,体现了持久性;

四、总结

    事务的使用满足了自己系统中的需求,不过以上代码只是自己研究的结果,自己并不是很满意,还请大家多多指正。当然,之后自己会在此基础之上加上存储过程,以完善自己的系统,敬请期待!


机房收费系统中“事务”的应用