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属性会被自动赋值。
完成以上操作,再执行就可以执行数据库的的增删改的错的了。