spring mvc + hibernate 事務管理 + mysql
阿新 • • 發佈:2019-02-16
一:配置事務:datasource.xml
<!-- 配置Hibernate事務管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
二:註解控制事務:
<tx:annotation-driven transaction-manager ="transactionManager" />
- 常用方式:@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
- 只讀:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
三:注意地方:
- 【mysql】:Engine為InnoDB,預設為MyISAM是不支援事務回滾;
- 【@Transactional】註解只在public的類、方法上有效;介面上配置無效;
- 【類級別】進入某服務類的事務由第一個方法上的事務型別生效,該方法呼叫自身類其它方法(其他方法具有不同的事務型別),事務型別還是依照第一個方法上的事務型別;
- 【開啟與關閉】假如由沒事務的控制層,進入服務類方法開啟該方法事務,退出服務類該方法事務結束;
四:註解配置:
- 遇到特定異常不回滾:notRollbackFor=RunTimeException.class
- propagation=Propagation.REQUIRED:如果有事務, 那麼加入事務, 沒有的話新建一個(預設情況下)
- propagation=Propagation.NOT_SUPPORTED:容器不為這個方法開啟事務
- propagation=Propagation.REQUIRES_NEW:不管是否存在事務,都建立一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務
- propagation=Propagation.MANDATORY:必須在一個已有的事務中執行,否則丟擲異常
- propagation=Propagation.NEVER:必須在一個沒有的事務中執行,否則丟擲異常(與Propagation.MANDATORY相反)
- propagation=Propagation.SUPPORTS:如果其他bean呼叫這個方法,在其他bean中宣告事務,那就用事務.如果其他bean沒有宣告事務,那就不用事務.
五:開啟事務日誌:
<logger name="org.hibernate" level="DEBUG" />
<root level="DEBUG">