数据库事务(简称: 事务)是数据库管理系统执行过程当中的一个逻辑单位,由一个有限的数据库操做序列构成。当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)须要确保该事务中的全部操做都成功完成且其结果被永久保存在数据库中,若是事务中有的操做没有成功完成,则事务中的全部操做都须要被回滚,回到事务执行前的状态;同时,该事务对数据库或者其余事务的执行无影响,全部的事务都好像在独立的运行。sql
事务的特性(ACID性质)数据库
原子性(Atomic) 数组
事务做为一个总体被执行,包含在其中的对数据库的操做要么所有被执行,要么都不执行。并发
一致性(Consistency) 函数
事务应确保数据库的状态从一个一致状态转变为另外一个一致状态。一致状态的含义是数据库中的数据应知足完整性约束。ui
隔离性(Isolation) spa
多个事务并发执行时,一个事务的执行不该影响其余事务的执行。.net
持久性(Durability) blog
已被提交的事务对数据库的修改应该永久保存在数据库中。事务
下面介绍事务的具体使用。
事务在数据库中的使用
- BEGIN TRANSACTION
-
- INSERT INTO Table1 VALUES('1','1')
- SET @Err1=@@ERROR
-
-
- INSERT INTO Table2 VALUES('1','1')
- SET @Err2=@@ERROR
-
- IF(@Err1=0 AND @Err2=0)
- COMMIT TRANSACTION
- ELSE
- ROLLBACK TRANSACTION
@@ERROR:完成 Transact-SQL 语句的执行时,若是语句执行成功,则 @@ERROR 设置为 0。若出现一个错误,则返回一条错误信息。@@ERROR 返回此错误信息代码,直到另外一条 Transact-SQL 语句被执行。
事务在.NET代码中的使用
首先添加引用usingSystem.Transactions;

(1)只在D层使用事务
- TransactionOptions option = new TransactionOptions();
- option.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
- using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, option))
- {
-
- bool flag = false;
- bool flagUpdate = false;
-
-
- string sqlUpText = "UPDATE Table1 SET actionReason = '1'";
- flagUpdate = sqlHelper.ExecuteNonQuery(sqlUpText,CommandType.Text);
-
-
- string sqlText = "UPDATE Table2 SET isAvailable ='否' ";
- flag = sqlHelper.ExecuteNonQuery(sqlText, CommandType.Text);
- if (flag && flagUpdate)
- {
- ts.Complete();
- return true;
- }
- else {
- return false;
- }
- }
(2)事务在B层的使用
B层代码
- SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["strConnDB"].ToString());
-
- sqlCon.Open();
-
- SqlTransaction sqlTran = sqlCon.BeginTransaction(IsolationLevel.ReadCommitted);
- try
- {
-
- OptionalCourseScheduleLinkDAL OptionalCourseSchedule = new OptionalCourseScheduleLinkDAL();
-
- IsAddOptionalCourseSchedule = OptionalCourseSchedule.AddOptionalCourseSchedule(enOptionalCourseSchedule,sqlCon,sqlTran);
-
-
- CourseTeachClassLinkDAL CourseTeachClass = new CourseTeachClassLinkDAL();
-
-
- IsUpdateCourseTeachClass = CourseTeachClass.UpdateCourseTeachClassOddEven(enCourseTeachClass,sqlCon,sqlTran);
-
-
- if (IsAddOptionalCourseSchedule && IsUpdateCourseTeachClass)
- {
-
- sqlTran.Commit();
- sqlCon.Close();
- return true;
- }
- else {
- sqlTran.Rollback();
- }
-
- }
- catch (Exception)
- {
-
- sqlTran.Rollback();
- }
-
- finally {
- sqlCon.Close();
- }
- return false;
D层代码
- public Boolean AddOptionalCourseSchedule(OptionalCourseScheduleLinkEntity enOptionalCourseScheduleLink, SqlConnection sqlCon, SqlTransaction sqlTran)
- {
-
-
- Boolean blnIsResult = false;
-
- string strSQL = "insert into TBR_OptionalCourseScheduleLink(TeachClassID,RoomID,WorkDay,ClassBegin,ClassEnd) VALUES(@TeachClassID,@RoomID,@WorkDay,@ClassBegin,@ClassEnd)";
-
- SqlParameter[] param = new SqlParameter[]
- {
- new SqlParameter("@TeachClassID",enOptionalCourseScheduleLink.TeachClassID),
- new SqlParameter("@RoomID",enOptionalCourseScheduleLink.RoomID),
- new SqlParameter("@WorkDay",enOptionalCourseScheduleLink.WorkDay),
- new SqlParameter("@ClassBegin",enOptionalCourseScheduleLink.ClassBegin),
- new SqlParameter("@ClassEnd",enOptionalCourseScheduleLink.ClassEnd)
-
- };
-
- CommandType cmdType = CommandType.Text;
-
- blnIsResult = sqlHelper.ExecNoSelect(strSQL, param, cmdType, sqlCon, sqlTran);
-
- return blnIsResult;
- }
SqlHelper中关于事务的代码
- #region 执行sql语句(事务中使用)
- public Boolean ExecNoSelect(string cmdText, SqlParameter[] paras, CommandType cmdType, SqlConnection sqlConns, SqlTransaction sqlTran)
- {
- try
- {
-
- sqlCmd = new SqlCommand(cmdText, sqlConns);
-
- sqlCmd.CommandType = cmdType;
-
- sqlCmd.Parameters.AddRange(paras);
-
- sqlCmd.Transaction = sqlTran;
-
- int intResult = sqlCmd.ExecuteNonQuery();
-
- if (intResult > 0)
- {
-
- return true;
- }
- else
- {
-
- return false;
- }
-
- }
- catch (Exception ex)
- {
-
- throw ex;
- }
- }
- #endregion