Spring事务管理器的配置和使用

                                  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:workspacessh_demouildclassesspringapplicationContext_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属性会被自动赋值。
完成以上操作,再执行就可以执行数据库的的增删改的错的了。
经验分享 程序员 微信小程序 职场和发展