1. 程式人生 > >spring mvc + hibernate 事務管理 + mysql

spring mvc + hibernate 事務管理 + mysql

一:配置事務: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)

三:注意地方:

  1. 【mysql】:Engine為InnoDB,預設為MyISAM是不支援事務回滾;
  2. 【@Transactional】註解只在public的類、方法上有效;介面上配置無效;
  3. 【類級別】進入某服務類的事務由第一個方法上的事務型別生效,該方法呼叫自身類其它方法(其他方法具有不同的事務型別),事務型別還是依照第一個方法上的事務型別;
  4. 【開啟與關閉】假如由沒事務的控制層,進入服務類方法開啟該方法事務,退出服務類該方法事務結束;

四:註解配置:

  • 遇到特定異常不回滾: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沒有宣告事務,那就不用事務.

五:開啟事務日誌:

  1. <logger name="org.hibernate" level="DEBUG" />
  2. <root level="DEBUG">