.net 跨数据库事务的实现

 

.net 跨数据库事务的实现~  

2010-11-06 15:19:37|  分类: asp.net|字号 订阅

 
 

 

古老的ASP�r代,要做Distributed Transaction(分散式交易,指跨越���|�Y料�斓慕灰祝�例如: ��SQL Server跟Oracle的更新�幼靼�成一��Transaction),有��偷�械姆椒āT�ASP最前端宣告一下<%@ Transaction=Required%>,�t整��ASP中的所有�Y料�觳僮鳎�不管Oracle、SQL、Sybase,通通��自�影�成Transaction,不用多��半行Code。

不�^,�@�N�� 可�e�⒁话伲�不可�e放一��的做法效能有�c�B(�B�]必要的SELECT�幼饕脖话�入Transaction)。����VB COM的人多半�����wSupport Transaction的COM+元件,用��绦刑囟ǖ馁Y料�斓母�新。而多�w���|�Y料�斓�Transactional元件可以再包出一��大 Transaction。不�^,�@得另外��COM,�]�缘�COM+ Application中,多了些�~外手�m。

ASP.NET 1.x�Q生後,��Ψ稚⑹浇灰祝�提供了一��四不像的做法: 
��一�w�^承自System.EnterpriseService.ServicedComponent的元件,�群�更新�Y料�斓某淌竭��,再�O定 TransactionAttribute,然後要Strong-Named/Signed,包上COM+的皮,�]�苑湃�COM+ Application中。

呃... 好像比以前��COM+�麻��,堂堂的.NET�是得回�^靠COM+才能���`分散式交易,��不��有�c...

�K於.NET 2.0中,��Ψ稚⑹浇灰鬃龀隽烁牧肌�System.Transactions.TransactionScope�大家有�C��重回ASP�r代的美妙�r光,可以�⑷我庖欢钨Y料�觳僮靼�成一��Transaction,不需要�~外的手工。例如以下的�例: (要Oracle支援Transaction,�得安�bOracle Service For Microsoft Transaction Server,不然��百忙一�觥�)

 

 

    21 TransactionOptions options = new TransactionOptions();

    22 options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;

    23 options.Timeout = new TimeSpan(0, 2, 0);

    24 using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))

    25 {

    26     try

    27      {

    28          using (SqlConnection sqlCn = new SqlConnection("Data Source=(local); User Id=scott; Password=tigger; Initial Catalog=Lab"))

    29           {

    30               SqlCommand cmd = new SqlCommand("INSERT INTO tblAccount (Account, Password, Username) VALUES (@acct, @pwd, @name)", sqlCn);

    31                cmd.Parameters.Add("@acct"SqlDbType.NVarChar).Value = "EMP" + DateTime.Now.ToString("HHmmss");

    32                cmd.Parameters.Add("@pwd"SqlDbType.NVarChar).Value = "PWD";

    33                cmd.Parameters.Add("@name"SqlDbType.NVarChar).Value = "NAME" + DateTime.Now.ToString("HHmmss");

    34                sqlCn.Open();

    35                cmd.ExecuteNonQuery();

    36           }

    37          //** ���y�Y果,ODP.NET 9207不Support TransactionScope,必�用.NET 2.0的System.Data.OracleClient

    38          using (OracleConnection oraCn = new OracleConnection("Data Source=MYORA; User Id=scott; Password=tigger;"))

    39           {

    40               OracleCommand cmd = new OracleCommand("INSERT INTO MYTABLE.tblAccount (Account, Password, Username) VALUES (:acct, :pwd, :name)", oraCn);

    41                cmd.Parameters.Add(":acct"OracleType.VarChar).Value = "EMP" + DateTime.Now.ToString("HHmmss")

    42                cmd.Parameters.Add(":pwd"OracleType.VarChar).Value = "PWD";

    43                cmd.Parameters.Add(":name"OracleType.VarChar).Value = "NAME" + DateTime.Now.ToString("HHmmss");

    44                oraCn.Open();

    45                cmd.ExecuteNonQuery();

    46           }

    47          //在scope.Complete();後才算Commit!

    48           scope.Complete();

    49      }

    50     catch (Exception ex)

    51      {

    52          //只要�]有scope.Complete(),先前的�幼鞫��Rollback

    53           Response.Write(ex.Message);

    54      }

    55 }

 

 

很�短吧? (有���^ServicedComponent的人才能感受出它的好呀!!) �榱俗C��Transaction效果,我在48行�OBreakpoint,�t中�辔�scope.Complete前,SQL的tblAccount��被�i 定�o法SELECT,而ORACLE中�tSELECT不到新增的�Y料(可�SQL用的是Lock大法,ORACLE�9� Snapshot);scope.Complete後,二者的新�Y料就都出�F了。

同�r,我�� 了故意ORACLE新增�幼魇�』虿蛔�scope.Complete(),�tSQL的tblAccount的新增�Y料就不��出�F。由此,可以��C以上的程 式的�_���`了分散式交易!! 而TransactionScope的�_比.NET 1.x的ServicedComponent方便多了,大幅�p少���|�Y料�彀�成交易的�}�s度。

我曾�著用ODP.NET 9207取代System.Data.OracleClient,�y��Y果�@示ODP.NET 9207�o法�⑴cTrasactionScope物件所建立的交易。後�碚业�Oracle的ODP.NET FAQ,提到了��ODP.NET 10.2.0.2.20起才支援.NET 2.0的System.Transactions,想用ODP.NET的人要留意。

最後�有一�c要注意,如果你的SQL在�h端主�C上,用的又是Windows 2003平台,�t�有好����P�要打通。包含了MSDTC在Windows 2003 SP1上有些�x�要�{整。�有,你可能���B�失�。��K得到以下�@��息:
Communication with the underlying transaction manager has failed. 
The transaction has already been implicitly or explicitly committed or aborted.
��中多半是防火��的�茏鳎�我的私房解法是在Windows Firewall上�_放MSDTC.EXE程式的所有�ν膺B�,���}就可解�Q。微�有篇�n}文章,介�BMSDTC�cFirewall�g的�酆耷槌穑�有�d趣的人也可以去挖挖��。

 

【一】加入System.Transactions�⒖�
於�0钢屑尤�⒖迹��x��[.NET]��`,往下拖拉便可以看到System.Transactions如下�D:


 

【二】�_��MSDTC的服��
��[控制台]→[系�y管理工具]→ �_��[服��],可以看到有��【Distributed Transaction Coordinator】服�瞻阉����
(PS:如果不��樱�程式�绦�r���l生【伺服器...上的MSDTC�o法使用...】的�息)

你可能感兴趣的:(事务,.transaction)