在评教系统里 ,自己做的那一个小功能,涉及到多个操作,但是因为一开始的时候并没有想到用事务来解决。主要原因还是对事务不是很了解,所以脑子里面就没有说需要用事务这个概念。但是事务可以说是一个数据库中很基础的概念,所以是必须要掌握的。
1.先来了解一下什么是事务?
所谓事务,是由用户定义的一个数据库操作序列,这些操作或者全部执行成功,或者一个也不执行,它是一个不可分割的逻辑工作单元,又称原子事务。
自己理解,事务主要是用来解决一个功能但是需要包含很多个操作来完成。比如说我们从账户A转500元到账户B。银行需要两步操作:第一步先从账户A中减去500元。第二步账户B添加500元。事务就是把这两个操作包裹起来,做为一个整体来执行,而其中不论哪个环节出错了,这件事都算是黄了。所以要么这两件事全部执行,要么全部不执行。
2.事务的特性?
原子性:事务必须是一个完整的自动的工作单元,或者执行全部操作,或者全部操作都不执行。
一致性:一致性是跟原子性密切相关的,指事务完成时,数据库从一个一致性状态变到另一个一致性状态。也就是说,事务成功提交时,数据达到一致的状态。
独立性:是指并发执行的各个事务之间不能互相干扰,每个事务的内部操作以及使用的数据都是独立的。
永久性:是指事务的完成之后,它对数据的修改是永久性的保存的,后续执行的其他操作或是数据库系统发生故障都不应该对其执行结果产生任何影响。(事务日志)
事务使用实例:
A.抽象出事务类,在这个类当中,主要是获取事务,提交事务,回滚事务,关闭事务连接。
public class TransactionBLL { //定义成员变量 private TransactionDAL TranDAL = new TransactionDAL(); #region 获取数据库连接 /// <summary> /// 获取数据库连接 /// </summary> /// <returns>数据库连接</returns> public SqlConnection GetConnection() { return TranDAL.GetConnection(); } #endregion #region 获取事务 /// <summary> /// 获取事务 /// </summary> /// <returns></returns> public SqlTransaction GetTransaction(SqlConnection conn) { return conn.BeginTransaction(); } #endregion #region 提交事务 /// <summary> /// 提交事务 /// </summary> public void Commit(SqlTransaction sqlTransaction) { sqlTransaction.Commit(); } #endregion #region 回滚事务 /// <summary> /// 回滚事务 /// </summary> public void Rollback(SqlTransaction sqlTransaction) { sqlTransaction.Rollback(); } #endregion #region 关闭连接 /// <summary> /// 关闭连接 /// </summary> public void Close(SqlConnection conn) { if (conn.State == ConnectionState.Open) { conn.Close(); } } #endregion } }
B.事务操作
{ //实例化事务对象 TransactionBLL tranBLL = new TransactionBLL(); //获得数据库连接 SqlConnection conn = tranBLL.GetConnection(); //开启事务对象 SqlTransaction tran = tranBLL.GetTransaction(conn); try { //删除教师成绩分数信息 Boolean deleteTeacherScores = teacherTotalScoresDAL.DeleteTotalScoreInfo(conn,tran); //统计教师成绩平均分 Boolean countAverageScore = projectAverageScoreDAL.QueryProjectAverageScores(conn,tran); //统计教师成绩总分 Boolean countTotalScore = teacherTotalScoresDAL.QueryTeacherTotalScores(conn, tran); if (true == deleteTeacherScores & true == countAverageScore & true == countTotalScore) { return true; } else { return false; } } catch (Exception) { //回滚事务 tranBLL.Rollback(tran); return false; } finally { tranBLL.Close(conn); } }
数据库基础这一块,一是由于理论性太强,之前的学习,可以说只是一个走马观花。就拿事务的原子性,一致性,永久性,独立性这四个特性来说,如果不真正去用一遍事务,真的很难知道这四个特性代表的是什么意思。