因為上次遇到在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