在程序行下文中声明一个事务管理器
jdbc事务管理器
DataSourceTransactionManager通过datasource检索到java.sql.Connection 对象来管理事务,一个成功的事务调用当前连接commit()提交,一个失败的事务通过rollbck()回滚
<bean id="transactionManager" class="org.springframework.jdbc. datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
jpa事务管理器
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean>
jto事务管理器
<bean id="transactionManager" class="org.springframework. transaction.jta.JtaTransactionManager"> <property name="transactionManagerName" value="java:/TransactionManager" /> </bean>
程序中使用事务管理器
public void saveSpittle(final Spittle spittle) { transactionTemplate.execute(new TransactionCallback<Void>() { //使用transctiontemplate,必须实现transactioncallback接口,该接口中只有一个function public Void doInTransaction(TransactionStatus txStatus) { try { spitterDao.saveSpittle(spittle); } catch (RuntimeException e) { txStatus.setRollbackOnly(); //回滚 throw e; } return null; } }); }
声明式事务
来源百度百科:声明式事务(Programmatic transaction management)是Spring提供的对程序事务管理的方式之一。
Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为单位,Spring的事务属性自然就在于描述事务应用至方法上的策略,在Spring中事务属性有以下四个参数:
1.传播行为
2.隔离级别
脏读: a事务写数据但未提交,b事务读取,a事务回滚,b读取的数据无效
不可重复读:a事务读取两次数据结果不同,可能另一并发事务在两次查询中改写数据
幻读取:事务在查询多条记录的过程中,数据被改写。
隔离级别:
SOLATION_DEFAULT 默认级别
ISOLATION_READ_UNCOMMITTED 允许读取尚未更改的数据,级别最低
ISOLATION_READ_COMMITTED 允许从已提交的并发事务中读取数据,可防止脏读,不可防止不可重复读和幻读
ISOLATION_REPEATABLE_READ 对相同字段的多次读取结果一致,不可防止幻读
ISOLATION_SERIALIZABLE 完全锁定当前事务涉及的table,级别最高,但是最慢
3.只读提示
如果事务只读取数据,数据库可优化,由后端数据库实施
4.事务超时期间
5. 回滚规则
定义哪些异常可引起回滚
声明事务
1 在spring2.0中声明事务
<tx:advice id="txAdvice" transaction-manager="txManager"> //使用tx命名空间 <tx:attributes> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="*" propagation="SUPPORTS" read-only="true"/> </tx:attributes> </tx:advice> <aop:config> //通知器,定义接受通知的bean <aop:advisor pointcut="execution(* *..SpitterService.*(..))"//实现spitterservice的所有的接口的bean advice-ref="txAdvice"/> </aop:config>
The five facets of the transaction pentagon are specified in the attributes of the <tx:method> element.
propagation 事务的传播规则isolation 事务的隔离级别
read-only 是否为只读
rollback-for 那该异常应该回滚
no-rollback-for 对于哪些异常当前事务应该继续执行而不回滚
timeout 事务超时时间
2 通过注解声明事务
在应用程序上下文中加入
<tx:annotation-driven transaction-manager="txManager" />
该注释告诉spring在类层或者方法层检查程序上下文的所有bean,寻找标注@transactional的bean,tx:annotation-driven 将自动把事务通知的内容给他
可注释在一个类上或一个接口或一个方法上
@Transactional(propagation=Propagation.SUPPORTS, readOnly=true) public class SpitterServiceImpl implements SpitterService { ... @Transactional(propagation=Propagation.REQUIRED, readOnly=false) public void addSpitter(Spitter spitter) { ... } ... }