【转】C#中使用TransactionScope类(分布式事务) 和 锁
如果在C#中使用TransactionScope類(lèi)(分布式事務(wù)),則須注意如下事項(xiàng):
1、在項(xiàng)目中引用using System.Transactions命名空間(先要在添加net組件的引用);
2、具體示例如下:
?
public static void sendMessage(){ TransactionOptions transactionOption = new TransactionOptions();//設(shè)置事務(wù)隔離級(jí)別transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;// 設(shè)置事務(wù)超時(shí)時(shí)間為60秒transactionOption.Timeout = new TimeSpan(0, 0, 60);using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption)){try{//TODOscope.Complete();}catch (Exception ex) {throw new Exception(ex.Message);}finally{//釋放資源scope.Dispose();} }}?
namespace System.Transactions {//// Summary:// Specifies the isolation level of a transaction.public enum IsolationLevel{//// Summary:// Volatile data can be read but not modified, and no new data can be added during the transaction.可讀取但不可修改易失性數(shù)據(jù),并且在此過(guò)程中不能添加新數(shù)據(jù)交易。Serializable = 0,//// Summary:// Volatile data can be read but not modified during the transaction. New data can be added during the transaction.在事務(wù)期間可以讀取但不能修改易失性數(shù)據(jù)。新數(shù)據(jù)可以在事務(wù)處理期間添加。RepeatableRead = 1,//// Summary:// Volatile data cannot be read during the transaction, but can be modified.事務(wù)期間無(wú)法讀取易失性數(shù)據(jù),但可以對(duì)其進(jìn)行修改。ReadCommitted = 2,//// Summary:// Volatile data can be read and modified during the transaction.在事務(wù)期間可以讀取和修改易失性數(shù)據(jù)。ReadUncommitted = 3,//// Summary:// Volatile data can be read. Before a transaction modifies data, it verifies if// another transaction has changed the data after it was initially read. If the// data has been updated, an error is raised. This allows a transaction to get to// the previously committed value of the data.可以讀取易失性數(shù)據(jù)。在事務(wù)修改數(shù)據(jù)之前,它會(huì)驗(yàn)證另一個(gè)事務(wù)在最初讀取數(shù)據(jù)后更改了數(shù)據(jù)。如果數(shù)據(jù)已更新,出現(xiàn)錯(cuò)誤。這使得事務(wù)可以到達(dá)以前提交的數(shù)據(jù)值。Snapshot = 4,//// Summary:// The pending changes from more highly isolated transactions cannot be overwritten.無(wú)法覆蓋來(lái)自高度隔離事務(wù)的掛起更改。Chaos = 5,//// Summary:// A different isolation level than the one specified is being used, but the level cannot be determined. An exception is thrown if this value is set.正在使用與指定隔離級(jí)別不同的隔離級(jí)別,但無(wú)法確定。如果設(shè)置了此值,則會(huì)引發(fā)異常。Unspecified = 6} }?
?
事務(wù)五種隔離級(jí)別IsolationLevel屬性一共支持五種事務(wù)設(shè)置,具體介紹如下:
(1)DEFAULT
使用數(shù)據(jù)庫(kù)設(shè)置的隔離級(jí)別(默認(rèn)),由DBA 默認(rèn)的設(shè)置來(lái)決定隔離級(jí)別。
(2)READ_UNCOMMITTED
這是事務(wù)最低的隔離級(jí)別,它充許別外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)。
會(huì)出現(xiàn)臟讀、不可重復(fù)讀、幻讀 (隔離級(jí)別最低,并發(fā)性能高)。
(3)READ_COMMITTED
保證一個(gè)事務(wù)修改的數(shù)據(jù)提交后才能被另外一個(gè)事務(wù)讀取。另外一個(gè)事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)。
可以避免臟讀,但會(huì)出現(xiàn)不可重復(fù)讀、幻讀問(wèn)題(鎖定正在讀取的行)。
(4)REPEATABLE_READ
可以防止臟讀、不可重復(fù)讀,但會(huì)出幻讀(鎖定所讀取的所有行)。
(5)SERIALIZABLE
這是花費(fèi)最高代價(jià)但是最可靠的事務(wù)隔離級(jí)別,事務(wù)被處理為順序執(zhí)行。
保證所有的情況不會(huì)發(fā)生(鎖表)。
?
3、對(duì)MSDTC組件設(shè)置:
???? 在控制面板--->管理工具--->服務(wù) 中,開(kāi)啟Distributed Transaction Coordinator 服務(wù)。
???? a.控制面板->管理工具->組件服務(wù)->計(jì)算機(jī)->我的電腦->右鍵->屬性
??? ?b.選擇MSDTC頁(yè), 確認(rèn)"使用本地協(xié)調(diào)器"
???? c.點(diǎn)擊下方"安全配置"按鈕
???? d.勾選: "允許網(wǎng)絡(luò)DTC訪問(wèn)","允許遠(yuǎn)程客戶(hù)端","允許入站","允許出站","不要求進(jìn)行身份驗(yàn)證".
???? e.對(duì)于數(shù)據(jù)庫(kù)服務(wù)器端, 可選擇"要求對(duì)呼叫方驗(yàn)證"
???? f.勾選:"啟用事務(wù)Internet協(xié)議(TIP)事務(wù)"。
???? g.在雙方防火墻中增加MSDTC.exe例外
???? 可用命令行: netsh firewall set allowedprogram %windir%\system32\msdtc.exe MSDTC enable
4、重啟IIS服務(wù)器。
?
?
2 鎖
鎖有樂(lè)觀鎖和悲觀鎖
2.1樂(lè)觀鎖實(shí)現(xiàn)方法有兩種
2.1.1加入時(shí)間戳
2.1.2 在UPDATE數(shù)據(jù)前對(duì)數(shù)據(jù)進(jìn)行比對(duì)
Set @money=Select money from account where accountId=1Update account set money =2000 where accountId=1 and money=@money這就實(shí)現(xiàn)了一個(gè)最簡(jiǎn)單的樂(lè)觀鎖,在update之前對(duì)拿到的數(shù)據(jù)進(jìn)行判斷或者加入時(shí)間搓機(jī)制
2.2 悲觀鎖
在事務(wù)一開(kāi)始就對(duì)你后面要修改的記錄鎖定
Select * from account with (UPDLOCK) where accountId=1一但鎖住,accountId=1 這一個(gè)記錄 在此事務(wù)結(jié)束前,別人都無(wú)法對(duì)其進(jìn)行修改或讀取,要等待此事務(wù)結(jié)束。
使用悲觀鎖,千萬(wàn)不要用以下語(yǔ)句
Select top 1 * from account with (UPDLOCK)這樣會(huì)鎖住account整個(gè)表,其他事務(wù)都無(wú)法對(duì)此表進(jìn)行讀取或者修改
在并發(fā)量不大的時(shí)候可以使用悲觀鎖,一但我要修改某條記錄,我就鎖住它,直到我整個(gè)事務(wù)完成。
并發(fā)量比較大的還是要使用樂(lè)觀鎖,但是要有失敗處理機(jī)制。
?
參考
TransactionScop事務(wù)機(jī)制的使用
臟讀、不可重復(fù)讀 共享鎖、悲觀鎖 和 事務(wù)五種隔離級(jí)別
?
總結(jié)
以上是生活随笔為你收集整理的【转】C#中使用TransactionScope类(分布式事务) 和 锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 首发加入XGP!《盟军敢死队3高清复刻版
- 下一篇: 【转】C++/CLI入门系列 第二篇:封