1.1)什么是事务?
事务指数据库中多个操作合并在一起形成的操作序列
1.2)事务的作用
1.当数据库操作序列中个别操作失败时,提供一种方式使数据库状态恢复到正常状态(**A**),保障数据库即使在异常状态下仍能保持数据一致性(**C**)(要么操作前状态,要么操作后状态)。
2.当出现并发访问数据库时,在多个访问间进行相互隔离,防止并发访问操作结果互相干扰(**I**)。
- 事务特征(ACID)
- 原子性(Atomicity)指事务是一个不可分割的整体,其中的操作要么全执行或全不执行
- 一致性(Consistency)事务前后数据的完整性必须保持一致
- 隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
- 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
1.3)事务的隔离级
- 脏读:允许读取未提交的信息
- 原因:Read uncommitted
解决方案: (表级读锁)
- 不可重复读:读取过程中单个数据发生了变化
- 解决方案: Repeatable read (行级写锁)
- 幻读:读取过程中数据条目发生了变化
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)
- 声明式(注解)