1、事务回顾
1.1、什么是事务?
事务指数据库中多个操作合并在一起形成的操作序列
1.2、事务的作用
1.当数据库操作序列中个别操作失败时,提供一种方式使数据库状态恢复到正常状态(A),保障数据库即使在异常状态下仍能保持数据一致性(C)(要么操作前状态,要么操作后状态)。
2.当出现并发访问数据库时,在多个访问间进行相互隔离,防止并发访问操作结果互相干扰(I)。
-
事务特征(ACID)
-
原子性(Atomicity)指事务是一个不可分割的整体,其中的操作要么全执行或全不执行
-
一致性(Consistency)事务前后数据的完整性必须保持一致
-
隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
-
持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
-
1.3、事务的隔离级
-
脏读:允许读取未提交的信息
-
原因:Read uncommitted
解决方案: (表级读锁)
-
-
不可重复读:读取过程中单个数据发生了变化
-
解决方案: Repeatable read (行级写锁)
-
-
幻读:读取过程中数据条目发生了变化
-
解决方案: Serializable(表级写锁)
-
1.4、 数据库共定义了四种隔离级别
Serializable(串行化):可避免脏读、不可重复读、虚读情况的发生。隔离级别最高
Repeatable read(可重复读):可避免脏读、不可重复读情况的发⽣。(幻读有可能发生) 第⼆隔离级别,该机制下会对要update的行进行加锁
Read committed(读已提交):可避免脏读情况发生。不可重复读和幻读⼀定会发生。 第三隔离级别
Read uncommitted(读未提交):最低级别,以上情况均无法保证。最低隔离级别
注意:级别依次升高,效率依次降低
MySQL的默认隔离级别是:REPEATABLE READ
查询当前使用的隔离级别: select @@tx_isolation;
设置MySQL事务的隔离级别: set session transaction isolation level xxx; (设置的是当前
mysql连接会话的,并不是永久改变的)
1.5、事务的传播行为
事务往往在service层进行控制,如果出现service层方法A调用了另外⼀个service层方法B,A和B方法本身都已经被添加了事务控制,那么A调用B的时候,就需要进行事务的⼀些协商,这就叫做事务的传播行为。
A调用B,我们站在B的角度来观察来定义事务的传播行为
PROPAGATION_REQUIRED | 如果当前没有事务,就新建⼀个事务,如果已经存在⼀个事务中, 加入到这个事务中。这是最常见的选择。 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 以⾮事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则 执行与PROPAGATION_REQUIRED类似的操作。 |
2、事务管理
2.1、Spring事务核心对象
-
J2EE开发使用分层设计的思想进行,对于简单的业务层转调数据层的单一操作,事务开启在业务层或者数据层并无太大差别,当业务中包含多个数据层的调用时,需要在业务层开启事务,对数据层中多个操作进行组合并归属于同一个事务进行处理
-
Spring为业务层提供了整套的事务解决方案
-
PlatformTransactionManager
-
TransactionDefinition
-
TransactionStatus
-
2.2、PlatformTransactionManager
-
平台事务管理器实现类
-
DataSourceTransactionManager 适用于Spring JDBC或MyBatis
-
HibernateTransactionManager 适用于Hibernate3.0及以上版本
-
JpaTransactionManager 适用于JPA
-
JdoTransactionManager 适用于JDO
-
JtaTransactionManager 适用于JTA
-
-
JPA(Java Persistence API)Java EE 标准之一,为POJO提供持久化标准规范,并规范了持久化开发的统一API,符合JPA规范的开发可以在不同的JPA框架下运行
-
JDO(Java Data Object )是Java对象持久化规范,用于存取某种数据库中的对象,并提供标准化API。与JDBC相比,JDBC仅针对关系数据库进行操作,JDO可以扩展到关系数据库、文件、XML、对象数据库(ODBMS)等,可移植性更强
-
JTA(Java Transaction API)Java EE 标准之一,允许应用程序执行分布式事务处理。与JDBC相比,JDBC事务则被限定在一个单一的数据库连接,而一个JTA事务可以有多个参与者,比如JDBC连接、JDO 都可以参与到一个JTA事务中
此接口定义了事务的基本操作
- 获取事务 :
TransactionStatus getTransaction(TransactionDefinition definition)
- 提交事务 :
void commit(TransactionStatus status)
- 回滚事务 :
void rollback(TransactionStatus status)
2.3、TransactionDefinition
此接口定义了事务的基本信息
- 获取事务定义名称
String getName()
- 获取事务的读写属性
boolean isReadOnly()
- 获取事务隔离级别
int getIsolationLevel()
- 获事务超时时间
int getTimeout()
- 获取事务传播行为特征
int getPropagationBehavior()
2.4、TransactionStatus
此接口定义了事务在执行过程中某个时间点上的状态信息及对应的状态操作
2.5、事务控制方式
-
编程式
-
声明式(XML)
-
声明式(注解)