事务简单来讲就是一组事情的集合,只有把这一组内的所有事情全部做完才能说完成了这个事务,如果在执行任意一件事情的过程中出现意外,则以前所做过的事情均恢复原样,就跟从来没发生过这件事一样。在编程中事务应用的非常广泛,而且在某些业务上必须要使用事务以应对可能出现的风险。一个典型的例子就是大家所熟悉的银行转账功能,转账简单来讲分为两步,第一步是从一个账户上减去需要转账的金额数目,第二步是向另外一个账户上增加转账金额。只有减去金额和增加金额都完成了我们才说这一事务执行完毕。我们可以想象如果没有加事务处理,当转账过程中只有第一步完成了,但是第二步没有完成便出现了意外这会是一件多么可怕的事情。既然事务这么重要,那事务具体怎样使用呢?下面亮出源码供大家参考:
public bool Add(ArrayList examNormTemplate)
{
//实例化一个DBTransaction对象
DBTransaction Db = new DBTransaction();
//获取连接
SqlConnection conn = Db.GetConnection();
//获取事务
SqlTransaction trans = Db.GetTransaction(conn);
//定义一个布尔型变量
bool isUseExamTemplate = false;
try
{
for (int i = 0; i < examNormTemplate.Count; i++)
{
ExamNormLinkEntity item = (ExamNormLinkEntity)examNormTemplate[i];
isUseExamTemplate = examMethod.Add(item, conn, trans);
}
//提交事务
Db.Commit(trans);
}
catch(Exception e)
{
//回滚事务
Db.Rollback(trans);
throw e;
}
finally
{
//关闭连接
Db.Close(conn);
}
//返回执行结果,如果isUseExamTemplate的值为true说明设定成功,否则设置失败
return isUseExamTemplate;
}
上面的代码是B层的一个类的Add方法,它所实现的功能是将ArrayList中的所有数据全部添加入数据库。从中我们可以看出该函数中使用了事务。由于原系统采用的是,U层,B层,D层 + SqlHelper的架构,B层中不可以直接引用SqlHelper来获取链接,所以在D层新建了DBTransaction类,该类的GetConnection方法通过调用SqlHelper类的GetConn方法来简介获取链接。当然我们还可以在DBTransaction类中写一个与SqlHelper类中获取链接的相同方法来取得链接,只不过这样会有代码冗余。下面是DBTransaction类中的代码:
public class DBTransaction
{
//定义一个SqlHelper私有变量
private SqlHelper SqlHelper = null;
//当实例化该类的时候同时实例化一个Sqlhelper对象
public DBTransaction()
{
SqlHelper = new SqlHelper();
}
/// <summary>
/// 获取数据库连接
/// </summary>
/// <returns></returns>
public SqlConnection GetConnection()
{
return SqlHelper.GetCon();
}
/// <summary>
/// 获取事务
/// </summary>
/// <returns></returns>
public SqlTransaction GetTransaction(SqlConnection conn)
{
return conn.BeginTransaction();
}
/// <summary>
/// 提交事务
/// </summary>
public void Commit(SqlTransaction sqlTransaction)
{
sqlTransaction.Commit();
}
/// <summary>
/// 回滚事务
/// </summary>
public void Rollback(SqlTransaction sqlTransaction)
{
sqlTransaction.Rollback();
}
/// <summary>
/// 关闭连接
/// </summary>
public void Close(SqlConnection conn)
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
}
事务的原子性决定了事务必须彻底执行完毕,否则将全部回滚,由此在一定程度上解决了安全性问题。本文同时附有Sqlhelper类的代码,想要进一步研究的同学科点击这里进行下载。