Spring框架最核心功能之一就是事务管理,Spring支持声明式事务和编程式事务事务类型,这能帮助咱们:java
Spring框架支持事务管理的核心是事务管理器抽象,经过定义接口 PlatformTransactionManager 让不一样数据访问框架来实现,mysql
public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
getTransaction():返回一个已经激活的事务或建立一个新的事务(根据给定的TransactionDefinition类型参数定义的事务属性),返回的是TransactionStatus对象表明了当前事务的状态,其中该方法抛出TransactionException(未检查异常)表示事务因为某种缘由失败。
commit():用于提交TransactionStatus参数表明的事务
rollback():用于回滚TransactionStatus参数表明的事务spring
TransactionDefinition接口sql
public interface TransactionDefinition { int getPropagationBehavior(); int getIsolationLevel(); int getTimeout(); boolean isReadOnly(); String getName(); }
配置文件数据库
<bean id="dataSource" parent="dataSourceParent"> <property name="url" value="jdbc:mysql://dbm.***.me:3306" /> <property name="username" value="root" /> <property name="password" value="123456" /> </bean> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = txManager.getTransaction(def); jdbcTemplate.execute(CREATE_TABLE_SQL); try { jdbcTemplate.update(INSERT_SQL, "test"); txManager.commit(status);  } catch (RuntimeException e) { txManager.rollback(status); }
<tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED"/> <tx:method name="*" propagation="REQUIRED" isolation="READ_COMMITTED" read-only="true"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="daoMethod" expression="execution(* com.dao.*.*(..))"/> <aop:advisor pointcut-ref="daoMethod" advice-ref="txadvice"/> </aop:config>