因為上次遇到在webservice中處理事務的問題,偶然在調試程序的時候對OracleConnection的連接字符串enlist設置的一個有趣的發現。
以前看過一篇文章,不記得是什麼文章了,文章中說對enlist最好設置為false,當時也沒有怎麼去深究為什麼要設置為false,在我的程序中enlist=false就直接寫進去了。現在才發現原來對enlist的設置與事務的處理是有這微妙的關系的。
事務管理器一般采用兩種方式來管理,一種稱之為Lightweight Transaction Management,簡稱LTM,一種稱之為oleX TM。在Simple phase提交中一般使用的是LTM,而在分布式事務處理中一般用的是2PC,所以使用的方式是oleX TM的方式。
如果enlist=false,那麼意味著後續的事務不會在當前事務中登記,所以當前事務不會成為事務的根。如果在程序中使用了分布式事務處理,可能也不會正確的執行(關於這一點我沒有做測試)。此時程序告訴TM采用LTM的方式來管理。
如果enlist=true,那麼進程告訴TM需要使用oleX TM的方式來管理,此時會自動啟用分布式事務管理,所以如果在連接字符串中將enlist=true,如果使用的是Oracle數據庫,那麼後台會調用oramts.dll,如果在開發環境下沒有安裝MTS for Oracle服務,那麼就會提示找不到oramts.dll。你可以從oracle的站點上下載這個服務的安裝包,不知道為什麼Oracle不提供單獨的安裝包,而是與odac捆綁在一起下載。
如果你沒有對enlist配置會出現什麼樣的情況呢?這樣看你的程序是使用分布式事務還是一般性的事務處理。TM會根據程序的請求自動做出反應。
結論:enlist對事務的登記有一定的控制作用。如果我的描述有錯,請幫助指正。
鏈接地址: http://yanrongpi.cnblogs.com/archive/2006/07/13/450189.Html