簡介
?????? 事務,英文名稱是 transaction 。是在對數據庫進行管理操作過程中一個邏輯單位,由有限的操作序列構成。
其實這個概念很好懂,簡單理解就是:事務就是在使用數據庫中的一個操作,由一些操作放到一起構成一個完
整的事務。例如:坐火車。假如坐火車只有兩個動作,買票,上車;這樣的話坐火車就需要兩個操作來完成,
買票、上車,現在將買票、上車都定義到這個坐火車的操作里面。這樣的話就方便了,想坐火車就直接調用坐
火車操作就完成坐火車的操作了。這里的坐火車就是一個事務,這里還有一種情況就是買票成功了,但是沒有
趕上火車,這時候我就需要把票給退了,退票這個操作就稱為回滾。
?
特性
??????? 那到底什么才是數據庫事務呢?就產生了數據庫事務的四個特性,通過這四個特性我們更好的理解事務,也
能夠反過來來辨別什么樣的操作是事務。
數據庫事務的特性簡單來說就是 ACID 。
?
?????? A( Atomic ) 翻譯為中文就是原子性
原子就是不可分割(在最初的時期是這么理解的)。所以可以理解到事務就是一個整體,一旦執行就是
執行整個事務,要么就不執行。
?????? C (Consistency)一致性
就是事務執行后,保證數據庫的所有數據都從一個狀態到另一個狀態。用上面的例子,可以這樣理解,
你上半身進了火車、坐好了;你的腳也要上火車、放好了(有點慎得慌)。但是是這個道理。
I (Isolation)隔離行
就是事務之間在執行的時候互補干擾,這里會提到一個并發控制的概念。什么是并發控制呢?并發控制
就是針對并發操作對數據操作異常的控制。舉個例子,又是買火車票;小林和小李都去網上買票,還
剩 5 張,他倆 11 : 11 同時去買同一張,這樣兩個事務同時訪問這個火車票,同時將剩余張改為 4. 這時候
實際上賣了 2 張,實際上剩了 3 張,而數據庫中為 4 張,這就造成了數據的異常。怎么處理呢?有一個辦
法,就是當你處理這個對象的時候,將這個對象鎖定( lock ),當完成事務后解鎖( unlock )。只有當
對象的狀態為 unlock 的狀態時,才能夠對這個對象進行訪問。說了多了啊,簡單擴展一下。嘿嘿
D( Durability ), 持久性
這個就更容易理解了。簡單理解就是你的對數據庫的操作一定是可以永久存在數據中的。
?
通過上述的講解,我們簡單了解了事務和事務的回滾以及事務的特性。下面我們通過另一個簡單的小例子來從
代碼層面上感受一下事務,順便熟悉泛型的使用。
環境: vs 2010? sql 2008
項目測試:通過事務來更新、添加數據
創建數據庫代碼
?
create database login use login create table login ( username varchar(20), userpwd varchar(20), userlevel varchar(20), )
界面
?
超級簡單的界面,為了整體性,還是上傳下,嘿嘿
客戶端代碼
?
private void btnExcuteSQLs_Click(object sender, EventArgs e) { List<string > strsql=new List<string>() ; string strone = "insert into login values('aaa','aaa','aaa')"; string strtwo = "update login set userlevel ='12' where username='cfl' "; strsql.Add(strone); strsql.Add(strtwo ); try { ExcuteSQLs(strsql); } catch (Exception ee ) { MessageBox.Show(ee.Message); throw new Exception(ee.Message ); //MessageBox.Show(ee.Message ); } } public void ExcuteSQLs(List<string> SQLStringList) { //建立連接數據庫 SqlConnection conn = new SqlConnection("server=“ip”;database=login;uid=sa;pwd=123456;"); //打開數據庫 conn.Open(); //建立執行數據操作命令對象 SqlCommand cmd = new SqlCommand(); //將數據庫連接對象賦值給命令對象 cmd.Connection = conn; //執行事務 SqlTransaction tx = conn.BeginTransaction(); //將事務賦值給命令對象 cmd.Transaction = tx; try { //通過for循環遍歷在泛型中的sql語句 for (int i = 0; i < SQLStringList.Count ; i++) { string strsql = SQLStringList[i].ToString(); //當字符串不為空,則執行 if (strsql.Length >1) { //傳入將要執行的sql語句 cmd.CommandText = strsql; //執行無參數化查詢 cmd.ExecuteNonQuery(); } } //事務提交 tx.Commit(); } catch (System .Data.SqlClient .SqlException e) { throw new Exception (e.Message ); } }
?
?
總結
?
以上就是對SQL事務的一些理解和實踐,總的來說。事務根據它本身的名字理解上就可以看出是用來執行
某一連串的對數據庫的操作的,常用的就是一些多個sql語句的執行。上述中就是一個簡單的例子,麻雀雖小五
臟俱全。里面有事務對SQL的封裝,泛型的簡單實用,以及如何向事務中傳入參數等等一些基本的操作。與大
家分享。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
