MySQL事务
请参阅http://blog.csdn.net/keysilence1/article/details/52460851事务篇
Spring事务管理
使用场景
应用于要求数据一致性要求比较高的场合,例如出现异常的情况,不会导致数据不一致,或出现脏数据等。
特点
为多种持久化层API的支持,比如说比较常用的JDBC、Hibernate、JPA、JTA等;
事务管理方式
支持两种:
- 编程式事务管理;
- TransactionTemplate,比较常用的方式;
- PlatformTransactionManager;
- 声明式事务管理;
声明式管理建立在AOP之上,本质上就是在方法前后进行拦截,在目标方法开始之前创建或加入一个事务,在目标方法执行完毕后执行提交或者回滚事务的操作。声明式事务管理最大的优点在于减少对业务的侵入性。- 注:两者之间比较,编程式事务管理可以作用于某一代码块,而声明式事务只能作用于某一方法上。并且对于后者这种管理方式,默认情况下,只有来自外部的调用才会被AOP截获,类内部方法调用本类其他的方法不会引起事务的行为,即使调用方法使用@Transaction注解进行了修饰。
自动提交
Spring底层已经将连接的自动提交属性设置成了false;
代理方式
配置
<context:property-placeholder order="21" location="classpath*:META-INF/spring/jdbc.properties" file-encoding="UTF-8" ignore-unresolvable="true"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="driverClass" value="${jdbc.driverClassName}"/>
<property name="acquireIncrement" value="${c3p0.acquireIncrement}"/>
<property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"/>
<property name="initialPoolSize" value="${c3p0.initialPoolSize}"/>
<property name="maxIdleTime" value="${c3p0.maxIdleTime}"/>
<property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
<property name="minPoolSize" value="${c3p0.minPoolSize}"/>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- enable autowire -->
<context:annotation-config/>
<!-- 此处使用CGLIB动态代理的方式,默认为JDK动态代理(proxy) -->
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />