机房收费系统完美设计——事务处理VS三层架构
上面的博客中只是通过简单的例子介绍事物的应用,但是在三层架构中事物应该怎样使用呢,要弄清楚这一点首先是明白事物、连接、command对象之间的关系
connection 对象是数据连接,他决定你链接什么数据库,数据库在哪里
command 对象是查询执行,由他来完成查询语句或执行语句
事物呢,一个连接可以有多个事物。但一个事物只属于一个连接。连接就好像北京到上海的一条铁路,事物就是铁路上的列出,列车可以只有车头,也可以带有好多车厢,火车包括车头都是要到北京的。但是要是要不整列火车到达北京,要不都没有到达。
上面是我对事物的理解。
说说我的三层架构:
我的三层结构中融入了设计模式,其中U层对B层的操作是通过外观模式来操作的。外观模式的作用就是让B层复杂的逻辑统一到一个外观中来。
以注册新卡为例:
注册新卡需要插入学生信息和卡信息。当然是需要放在事物里的。要不都插入成功,要不都不插入。
通过以上我的解说大家应该能想出,事物的开始和结束都要放在外观层的(后面用Fa层代替)但是事物的创建时要在连接的基础上的。也就是Fa层要获得连接。就要在B、D、Factory、IDAL走一遍。然后获得的Transaction,还要以参数的形式传回D层操作。这个过程走下来,我发现自己要改的东西又有很多了。
让我们先看看怎么实现。
这里我找了一部分别人的代码。其中的Sqlhelper写的比较有代表性。给大家分享。当然方法一定不止是有一个的。大家写好的sqlhelper不一定不好。
将事务处理独立出来,该类的功能主要是创建数据库连接,开启事务处理,关闭连接。代码如下:
[vb]
Imports System.Data.Common
Public Class TranUtil
Private Sub New()
End Sub
'开启事务
Public Shared Function BeginTransaction() As IDbTransaction
Dim conn As DbConnection = DButil.CreateConnection
If conn.State = ConnectionState.Closed Then
conn.Open()
End If
Dim tran As IDbTransaction = conn.BeginTransaction()
Return tran
End Function
'关闭连接
Public Shared Sub Close(ByVal tran As IDbTransaction)
If tran IsNot Nothing AndAlso tran.Connection.State = ConnectionState.Open Then
tran.Connection.Close()
tran = Nothing
End If
End Sub
Imports System.Data.Common
Public Class TranUtil
Private Sub New()
End Sub
'开启事务
Public Shared Function BeginTransaction() As IDbTransaction
Dim conn As DbConnection = DButil.CreateConnection
If conn.State = ConnectionState.Closed Then
conn.Open()
End If
Dim tran As IDbTransaction = conn.BeginTransaction()
Return tran
End Function
'关闭连接
Public Shared Sub Close(ByVal tran As IDbTransaction)
If tran IsNot Nothing AndAlso tran.Connection.State = ConnectionState.Open Then
tran.Connection.Close()
tran = Nothing
End If
End Sub
数据库操作类代码如下:
[vb]
Imports System.Data.Common
Imports System.Configuration
Imports System.Reflection.MethodBase
Imports MySql.Data.MySqlClient
Imports log4net
Public Class DButil
Private Shared log As ILog = LogManager.GetLogger(GetCurrentMethod().DeclaringType.ToString)
Private Sub New()
End Sub
' 创建数据库链接
Public Shared Function CreateConnection() As DbConnection
log.Info("创建数据库连接")
Try
'读取app.config中的连接字符串
Dim sConn As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
'创建数据库连接
Dim dbConn As MySqlConnection = New MySqlConnection(sConn)
Return dbConn
Catch ex As Exception
log.Error(ex)
Throw ex
End Try
End Function
'取得DbCommand
Public Shared Function GetSqlCommand(ByVal connection As DbConnection, ByVal sqlQuery As String) As DbCommand
log.Info("sqlQuery:" & sqlQuery)
Try
Dim dbCommand As MySqlCommand = connection.CreateCommand
dbCommand.CommandText = sqlQuery
dbCommand.CommandType = CommandType.Text
Return dbCommand
Catch ex As Exception
log.Error(ex)
Throw ex
End Try
End Function
' 给DbCommand对象的参数
补充:软件开发 , Vb ,