Spring事務管理器的配置和使用
1.爲什麼要配置spring事務管理器。
在將spring和hibernate結合之後,我們需要將事務管理交給spring管理。以保證數據的安全型,避免髒數據的出現。通過spring注入來完成此功能。
步驟1:在spring的配置文件中配置事務管理器
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
</bean>
步驟2:配置完事務管理器,需要給事務管理器加上各種參數。
<!-- 哪些方法需要Spring開啓事務
transaction-manager="transactionManager":指定事務管理器
通知類型:Spring幫我們寫好
-->
<tx:advice transaction-manager="transactionManager" id="txAdvice">
<tx:attributes>
<!--
REQUIRED:需要開啓事務
rollback-for:拋出哪些異常需要Spring回滾
name="save*":以save開頭的要開啓事務
rollback-for:拋出哪類異常(以及子類)的時候,Spring事務回滾,默認是RunTimeException
-->
<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/>
<!--
其它方法,只能讀
-->
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
步驟3:指定那些類執行事務管理器,,可以將事務管理器也理解成一種通知類型。(通知類型可以理解成就是攔截器,配置及使用參照)一般來說都是放在Service層,因爲放在Dao層來說,Dao層每次都是執行一條sql成功與否對其他的sql沒影響。但是放到Service層當一條sql語句出現錯誤時,事務回滾
<!-- 配置AOP,
目的:哪些類裏面的哪些方法執行事務管理器
-->
<aop:config>
<!-- 定義哪些類執行事務管理器
推薦放到實現類上面(Service)
-->
<aop:pointcut expression="execution(* com.bjsxt.*.service.impl.*.*(..))" id="pointcut"/>
<!-- 將事務管理器和橫切面(pointcut)關聯起來 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>
以上三步配置完成之後,運行項目你會發現tomcat會給你報Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined
in file [F:\workspace\ssh_demo\build\classes\spring\applicationContext_common.xml]: Invocation of init method failed; nested exception is
org.hibernate.service.UnknownUnwrapTypeException: Cannot unwrap to requested type [javax.sql.DataSource]
這段話的意思是說transactionManager我們配置的那個事務管理器找不到DataSource,我們需要將數據源也交給事務管理器
步驟4:配置數據源
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 驅動 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<!-- url -->
<property name="url" value="jdbc:mysql://localhost:3306/ssh"/>
<!-- 用戶名 -->
<property name="username" value="root"/>
<!-- 密碼 -->
<property name="password" value="199464"/>
</bean>
開啓自動裝備之後,開啓自動裝備transactionManager中的Datasource屬性會被自動賦值。完成以上操作,再執行就可以執行數據庫的的增刪改的錯的了。