在乙個mis系統中,沒有用事務那就絕對是有問題的,要麼就只有一種情況:你的系統實在是太小了,業務業務邏輯有只要一步執行就可以完成了。因此掌握事務處理的方法是很重要,進我的歸類在.net中大致有以下4種事務處理的方法。大家可以參考一下,根據實際選擇適當的事務處理。
1 sql事務
sql事務是使用sql server自身的事務:在儲存過程中直接使用begin tran,rollback tran,commit tran實現事務:
優點:執行效率最佳
限制:事務上下文僅在資料庫中呼叫,難以實現複雜的業務邏輯。
demo:(所有demo,都以sql server自帶的northwind資料的表region為例)
帶事務的儲存過程
create procedure dbo.sptransaction
(@updateid int,
@updatevalue nchar(50),
@insertid int,
@insertvalue nchar(50))as
begin tran
update region set regiondescription=@updatevalue where regionid=@updateid
insert into region values (@insertid,@insertvalue)
declare @regionerror int
select @regionerror=@@error
if(@regionerror=0)
commit tran
else
rollback tran
go執行帶事務的儲存過程
/**
/// sql事務:
///
public void sqltran()
;paras[0].value = "2";
paras[1].value = "update value1";
paras[2].value = "6";
paras[3].value = "insert value1";
foreach (sqlparameter para in paras )
cmd.executenonquery();
}2 ado.net事務
ado.net事務可能是大家一般都用的
優點:簡單,效率和資料庫事務差不多。
缺點:事務不能跨資料庫,只能在乙個資料庫連線上。如果是兩個資料庫上就不能使用該事務了。
demo:
ado.net事務
/**
/// 一般的ado.net 事務
///
public void adonettran1()
;paras[0].value = "2";
paras[1].value = "update value12";
foreach (sqlparameter para in paras)
//開始事務
cmd.transaction = conn.begintransaction();
cmd.executenonquery();
cmd.commandtext = "insert into region values(@insertid,@insertvalue)";
cmd.commandtype = commandtype.text;
paras = new sqlparameter;
paras[0].value = "7";
paras[1].value = "insert value";
cmd.parameters.clear();
foreach (sqlparameter para in paras)
cmd.executenonquery();
//提交事務
cmd.transaction.commit();
}catch
finally
}3 transactionscope事務
transactionscope事務類,它可以使**塊成為事務性**。並自動提公升為分布式事務
優點:實現簡單,同時能夠自動提公升為分布式事務
demo:
transactionscope事務
/**
/// transactionscope事務:可自動提公升事務為完全分布式事務的輕型(本地)事務。
/// 使用時要保證msdtc服務(控制分布事務)是開啟的可以使用:net start msdtc命令開啟服務;
///
public void adonettran2()
;paras[0].value = "2";
paras[1].value = "update value12";
foreach (sqlparameter para in paras)
cmd.executenonquery();
cmd.commandtext = "insert into region values(@insertid,@insertvalue)";
cmd.commandtype = commandtype.text;
paras = new sqlparameter;
paras[0].value = "8";
paras[1].value = "insert value";
cmd.parameters.clear();
foreach (sqlparameter para in paras)
cmd.executenonquery();
//提交事務
ts.complete();}}
catch
finally
}4 com+事務
在分布式應用程式中,往往要同時操作多個資料庫,使用資料庫事務就不能滿足業務的要求了。在com+中,提供完整的事務處理服務。很方便處理多個資料庫上的事務。
demo:
com+事務
/**
/// com+事務
///
public void comtran()
;paras[0].value = "2";
paras[1].value = "update value22";
foreach (sqlparameter para in paras)
cmd.executenonquery();
cmd.commandtext = "insert into region values(@insertid,@insertvalue)";
cmd.commandtype = commandtype.text;
paras = new sqlparameter;
paras[0].value = "9";
paras[1].value = "insert value";
cmd.parameters.clear();
foreach (sqlparameter para in paras)
cmd.executenonquery();
//提交事務
contextutil.setcomplete();
}catch
finally
}在.net中還有些也能進行事務處理,如web service中
需要特別補充的是:
如果你使用的是分布事務(transactionscope事務和com+事務),在預設情況下你是要重新配置安裝sql server資料庫伺服器和訪問資料庫的客戶端的.(如果沒有配置執行會出現以下錯誤:該夥伴事務管理器已經禁止了它對遠端/網路事務的支援。 (異常來自 hresult:0x8004d025)
)下面是msdn上關於配置分布式事務的一段原話:
配置分布式事務
要啟用分布式事務,可能需要通過網路啟用 ms dtc,以便在使用應用了最新的 service pack 的較新作業系統(例如 windows xp 或 windows 2003)時使用分布式事務。如果啟用了 windows 防火牆(windows xp service pack 2 的預設設定),必須允許 ms dtc 服務使用網路或開啟 ms dtc 埠。
實際怎麼配置呢,經過我的實際使用:大致如下:開啟'控制面板'->'管理工具'->'元件服務',點開'元件服務'->'計算機'->'我的電腦',在'我的電腦'上右擊屬性,點'msdtc',然後點'安全性配置'。作為資料庫的伺服器的配置如下:
而訪問資料庫的客戶端的配置和伺服器端的稍有些差別:
在設定完上面的還有使防火牆ms dtc 服務使用網路或開啟 ms dtc 埠:執行netsh firewall set allowedprogram %windir%\system32\msdtc.exe msdtc enable命令就可以了
SQL Server中的常用函式彙總
在sql server中常用5類的函式 字串函式,日期函式,數學函式,系統函式,聚合函式。常用的字串函式 1.charindex 字元索引 2.len 長度 3.upper 大寫 4.ltrim 左裁減 5.rtrim 右裁減 6.left 左 7.right 右 8.stuff 刪除並新增 9.r...
關於 sqlserver 的事物回滾
例 先進行標記事物的開始 begin transaction 進行表的操作,例如插入 修改等。在進行過程中,如果發生錯誤則回滾事物 rollback transaction 若事物結束,則提交事物 commit 在事物過程中通常用 error 語句是否發生錯誤 例如,插入幾條資料,後面的資料主鍵重複...
sql server 優化 彙總
原創連線 sql server查詢優化 sql server效能優化綜述 sql語句優化彙總 sql優化34條 sql語句優化彙總 sql server資料庫的整理優化的基本過程 一 sql server 資料庫的整理優化的基本過程 二 sql server優化 1 索引 2008 sql serv...