<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    <!-- 开启注解处理器 -->
    <context:annotation-config/>
	<!-- 定义使用C3P0连接池的数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<!-- 指定连接数据库的JDBC驱动 -->
		<property name="driverClass">
		 	<value>com.mysql.jdbc.Driver</value>
		 </property>
		<!-- 连接数据库所用的URL -->
		<property name="jdbcUrl">
			<value>jdbc:mysql://localhost:3306/db_user?useUnicode=true&characterEncoding=gbk</value>
		</property>
		<!-- 连接数据库的用户名 -->
		<property name="user">
			<value>root</value>
		</property>
		<!-- 连接数据库的密码 -->
		<property name="password">
			<value>111111</value>
		</property>
		<!-- 设置数据库连接池的最大连接数 -->
		<property name="maxPoolSize">
			<value>20</value>
		</property>
		<!-- 设置数据库连接池的最小连接数 -->
		<property name="minPoolSize">
			<value>2</value>
		</property>
		<!-- 设置数据库连接池的初始化连接数 -->
		<property name="initialPoolSize">
			<value>2</value>
		</property>
		<!-- 设置数据库连接池的连接的最大空闲时间,单位为秒 -->
		<property name="maxIdleTime">
			<value>20</value>
		</property>
	</bean>
	<!-- 注册一个JDBC数据源事务管理器 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  	   <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 基于AOP技术的事务管理实现 -->
	<aop:config>
		<!-- 定义一个事务切入点,拦截test.spring.dao.impl.UserDaoImpl中的所有方法 -->
		<aop:pointcut id="transactionPointcut" expression="execution(* test.spring.dao.impl.UserDaoImpl.*(..))"/>
		<!-- 引用txAdvice事务通知 -->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/>
	</aop:config>
	<!-- 定义一个事务通知txAdvice -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<!-- 所有以load开头的方法声明为不需要事务 -->
			<tx:method name="load*" read-only="true" propagation="NOT_SUPPORTED"/>
			<!-- 其它所有方法声明为默认的REQUIRED类型的事务传播方式 -->
			<tx:method name="*"/>
		</tx:attributes>
	</tx:advice>    	
	<!-- 注册一个JdbcTemplate实例名称为jdbcTemplate -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<constructor-arg ref="dataSource"/>
	</bean>     
	<!-- 注册一个UserDaoImpl实例名称为dao -->
	<bean id="dao" class="test.spring.dao.impl.UserDaoImpl"/>
	<!-- 注册一个UserServiceImpl实例名称为service -->
	<bean id="service" class="test.spring.service.impl.UserServiceImpl"/>
	<!-- 注册一个UserAction实例名称为userAction -->
	<bean id="userAction" class="test.spring.action.UserAction"/>
</beans>
 
 

<!--
mysql 默认引擎不支持事务,引擎为:MyISAM
修改成:InnoDB

mysql默认的数据库引擎是MyISAM,不支持事务和外键,也可使用支持事务和外键的InnoDB。

查看当前数据库的所支持的数据库引擎以及默认数据库引擎

show engines;更改方式1:修改配置文件my.ini

我将my-small.ini另存为my.ini,在[mysqld]最后添加为上default-storage-engine=InnoDB,重启服务,数据库默认的引擎修改为InnoDB

更改方式2:在建表的时候指定或者建完表修改

--建表的时候指定
create table mytbl(
 id int primary key,
 name varchar(50)
)type=MyISAM;

--建完表后修改
alter table mytbl2 type = InnoDB;

--查看修改结果(mytest为表所在的database名字)
show table status from mytest;

 -->

 

 
如果一个方法抛出Exception或者Checked异常,Spring事务管理默认不进行回滚。 

二、改变默认方式 
在@Transaction注解中定义noRollbackFor和RollbackFor指定某种异常是否回滚。 
@Transaction(noRollbackFor=RuntimeException.class) 
@Transaction(RollbackFor=Exception.class) 
这样就改变了默认的事务处理方式。 
三、启示 
这就要求我们在自定义异常的时候,让自定义的异常继承自RuntimeException,这样抛出的时候才会被Spring默认的事务处理准确处理。
关于异常的分类一下详细介绍: