一.我碰到的事務失效的可能原因:
(1)由于采用的是SpringMVC、 MyBatis,故統(tǒng)一采用了標注來聲明Service、Controller?由于服務器啟動時的加載配置文件的順序為web.xml—root-context.xml(Spring的配置文件)—servlet- context.xml(SpringMVC的配置文件),由于root-context.xml配置文件中Controller會先進行掃描裝配,但是此時service還沒有進行事務增強處理,得到的將是原樣的Service(沒有經(jīng)過事務加強處理,故而沒有事務處理能力),所以我們必須在root-context.xml中不掃描Controller
(2)Spring容器優(yōu)先加載由ServletContextListener(對應applicationContext.xml)產(chǎn)生的父容器,而 SpringMVC(對應mvc_dispatcher_servlet.xml)產(chǎn)生的是子容器。子容器Controller進行掃描裝配時裝配的 @Service注解的實例是沒有經(jīng)過事務加強處理,即沒有事務處理能力的Service,而父容器進行初始化的Service是保證事務的增強處理能力 的。如果不在子容器中將Service exclude掉,此時得到的將是原樣的無事務處理能力的Service,因為在? ? 多上下文的情況下,如果同一個bean被定義兩次,后面一個優(yōu)先。
二.我的處理過程,僅供借鑒