簡介
?????? 事務,英文名稱是 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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

