public class OrderDao { public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } private JdbcTemplate jdbcTemplate; public void lessmoney(){ String sql="update account set salary=salary-? where username=?"; jdbcTemplate.update(sql,1000,"zhangsan"); } public void moremoney(){ String sql="update account set salary=salary+? where username=?"; jdbcTemplate.update(sql,1000,"lisi"); } }
public class OrderService { public void setOrderDao(OrderDao orderDao) { this.orderDao = orderDao; } private OrderDao orderDao; public void accountchange(){ orderDao.lessmoney(); //製造個異常,事務不能進行,進行回滾 int i=100/0; orderDao.moremoney(); } }
<!--用xml的方式配置c3p0 鏈接數據--> <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!--配置屬性--> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql:///mysql"></property> <property name="user" value="root"></property> <property name="password" value="raoxiaobo123"></property> </bean> <!--事務管理 1.配置事務管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="datasource"></property> </bean> <!--2.配置事務加強--> <tx:advice id="tx-advice" transaction-manager="transactionManager"> <tx:attributes> <!--要加強的方法,account*爲開頭account的方法--> <tx:method name="account*"/> </tx:attributes> </tx:advice> <!--3.配置切面--> <aop:config> <aop:pointcut id="pointcut1" expression="execution(* com.xiaobo.transaction.OrderService.*())"></aop:pointcut> <aop:advisor advice-ref="tx-advice" pointcut-ref="pointcut1"></aop:advisor> </aop:config> <bean id="orderService" class="com.xiaobo.transaction.OrderService"> <property name="orderDao" ref="orderDao"></property> </bean> <bean id="orderDao" class="com.xiaobo.transaction.OrderDao"> <property name="jdbcTemplate" ref="jdbcTemplate"></property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="datasource"></property> </bean>
public class testDemo { @Test public void testTransaction(){ ApplicationContext context=new ClassPathXmlApplicationContext("bean5.xml"); OrderService orderService= (OrderService) context.getBean("orderService"); orderService.accountchange(); } }
<!--用xml的方式配置c3p0 鏈接數據--> <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!--配置屬性--> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql:///mysql"></property> <property name="user" value="root"></property> <property name="password" value="raoxiaobo123"></property> </bean> <!--事務管理 1.配置事務管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="datasource"></property> </bean> <!--2.開啓事務註解--> <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven> <bean id="orderService" class="com.xiaobo.transaction.OrderService"> <property name="orderDao" ref="orderDao"></property> </bean> <bean id="orderDao" class="com.xiaobo.transaction.OrderDao"> <property name="jdbcTemplate" ref="jdbcTemplate"></property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="datasource"></property> </bean>
//第三步開啓註解 @Transactional public class OrderService { public void setOrderDao(OrderDao orderDao) { this.orderDao = orderDao; } private OrderDao orderDao; public void accountchange(){ orderDao.lessmoney(); //製造個異常,事務不能進行,進行回滾 int i=100/0; orderDao.moremoney(); } }