定义
逻辑上的一组操作,要么全做,要么全不做。
四大特性(简称ACID):
- 原子性(Atomicity)
事务是不可分割工作单元 - 一致性(Consistency)
事务前后数据的完整性必须保持一致 - 隔离性(Isolation)
多个用户并发访问时,多个并发事务之间是数据相互隔离的 - 持久性(Durability)
一个事务一旦被提交,它对数据库中数据的改变就是永久性的
常用API
3个主要接口
- PlatformTransactionManager
事务管理器 - TransactionDefinition
事务定义信息 - TransactionStatus
事务具体运行状态
事务隔离级别
如果不考虑隔离性,会引发安全问题:
1.脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。
2.不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。
3.幻读(虚读):一个事务读取几行记录后,另一个事务插入一些记录,幻读就发生了。在后来的查询中,第一个事务就会发现有些原来没有的记录。
补充:
(1)Mysql 默认采用的 REPEATABLE_READ隔离级别
(2)Oracle 默认采用的 READ_COMMITTED隔离级别
事务传播行为
补充:
第一类共同点:如果 A 方法中有事务,则调用 B 方法时就用该事务,即:A和B方法在同一个事务中。PROPAGATION_REQUIRED:如果 A 方法中没有事务,则调用 B 方法时就创建一个新的事务,即:A和B方法在同一个事务中。PROPAGATION_SUPPORTS:如果 A 方法中没有事务,则调用 B 方法时就不使用该事务。PROPAGATION_MANDATORY:如果 A 方法中没有事务,则调用 B 方法时就抛出异常。
第二类共同点:A方法和B方法没有在同一个事务里面。PROPAGATION_REQUIRES_NEW:如果 A 方法中有事务,则挂起并新建一个事务给 B 方法。PROPAGATION_NOT_SUPPORTED:如果 A 方法中有事务,则挂起。PROPAGATION_NEVER:如果 A 方法中有事务,则报异常。
第三类:如果 A 方法有的事务执行完,设置一个保存点,如果 B 方法中事务执行失败,可以滚回保存点或初始状态。
重点的三种:PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED。
编程式事务
实际中很少使用
通过TransactionTemplate手动管理事务
声明式事务
开发过程中推荐使用
通过使用AOP实现
在配置文件XML中
使用方式
- 注解
- AspectJ
- 基于TransactionProxyFactoryBean方式