备注:网上相关的转载文章实在是乱如麻,且大多都一模一样没什么新意,赘述不清的还是赘述不清,搞得人真就一头雾水。今天就当是在给自己做学习笔记的备份上传到网上吧,至少整理得自己比较满意,需要深度学习的话推荐去看正版书,网上乱七八糟的资料容易让人摸不清方向。
事务处理位于JavaEE分层开发体系中的业务层,Spring事务控制的实现全部基于AOP,其既可采用编程的方式实现,也可采用配置的方式实现,我们重点学习如何采用配置实现对事务的控制。
PlatformTransactionManager平台事务管理器接口主要用于完成事务的提交、回滚以及获取事务的状态信息。
获取事务的状态:TransactionStatus getTransaction(TransactionDefinition definition)
提交事务:void commit(TransactionStatus status)
回滚事务:void rollback(TransactionStatus status)
Spring事务的默认回滚方式:运行时异常(程度重) / 受查时异常(程度轻,也称编译异常,包括继承Exception的自定义异常)。
常用的两个实现类
① DataSourceTransactionManager:采用Spring JDBC或iBatis进行数据持久化时使用。
② HibernateTransactionManager:采用Hibernate进行数据持久化时使用。
TransactionDefinition事务定义接口中定义了事务隔离级别、事务传播行为常量以及事务的默认超时时限。
事务常用API
① 获取事务的名称:String getName()
② 获取事务的隔离级别:int getIsolationLevel()
③ 获取事务的传播行为:int getPropagationBehavior()
④ 获取事务的超时时限:int getTimeout()
⑤ 是否对只读事务(查询)进行优化:boolean isReadOnly()
事务隔离级别(5个) - 反映事务提交并发访问时的处理方式
① 事务的默认隔离级别:ISOLATION_DEFAULT,MySQL默认隔离级别为4,表示可重复读;Oracle默认隔离级别为2,表示可读和提交
② 读已提交(解决脏读,存在幻读与不可重复读):ISOLATION_READ_COMMITTED
③ 读未提交(未解决任何并发问题):ISOLATION_READ_UNCOMMITTED
④ 可重复读(解决脏读和不可重复读,存在幻读):ISOLATION_REPEATABLE_READ
⑤ 串行化(不存在并发问题):ISOLATION_SERIALIZABLE
事务传播行为常量(7个)
* PROPAGATION_REQUIRED:指定的方法必须在事务内执行,默认值。
* PROPAGATION_SUPPORTS:指定的方法支持当前事务,若当前没有事务,也可以以非事务的方式执行。
* PROPAGATION_MANDATORY:指定的方法必须在当前事务内执行,若当前没有事务则直接抛出异常。
* PROPAGATION_REQUIRES_NEW:总是创建新的事务,若当前存在事务则将当前事务挂起,直至新的事务执行完毕。
* PROPAGATION_NOT_SUPPORTED:指定的方法不能在事务环境中执行,若当前存在事务则挂起事务。
* PROPAGATION_NEVER:指定的方法不能在事务环境中执行,若当前存在事务则直接抛出异常。
* PROPAGATION_NESTED:指定的方法必须在事务内执行。
事务默认超时时限 - TIMEOUT_DEFAULT
该常量定义着事务底层默认的超时时限以及不支持事务超时时限时设置的none值,事务的超时时限起作用的条件繁多且超时的时间计算点较为复杂,因此我们一般仅使用其默认值。
TransactionStatus事务状态接口提供了6个获取事务具体运行状态的方法。
① 刷新事务:void flush()
② 设置事务回滚:void setRollbackOnly()
③ 事务是否回滚:boolean isRollbackOnly()
④ 事务是否是新的事务:boolean isNewTransaction()
⑤ 事务是否已经完成:boolean isCompleted()
⑥ 事务是否处于存储点:boolean hasSavepoint()