數據庫事務(簡稱: 事務)是數據庫管理系統執行過程當中的一個邏輯單位,由一個有限的數據庫操做序列構成。當事務被提交給了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