概念:
事务是
指逻辑上的一组操作,组成这组操作的一系列操作要么全部成功,要么一个都不做。因此,事务的结束有两种,当事务中的所有操作全部成功执行时,事务提交。如果其中一个操作失败,将发生回滚操作,撤消到事务开始时的状态。
针对数据库,存储数据,要么成功,要么失败。
事务的特性:
- 原子性: 每一个事务都是不可再分割的,即使有多条语句,也是一个整体。要么一起成功,要么一起失败
- 一致性:执行事务的前后,数据库的状态应该是一致的。比如转账前后,数据库的总金额是一样的
- 隔离性:如果同时又几个事务同时在数据库中运行,互不影响。
- 持久性:事务一旦执行成功,对数据库的影响是持久性的。即使关机。
事务的隔离级别
一般理想状态下,事务的操作是互补干涉的。
但是并发访问会产生一下三个问题
- 脏读:一个事务中,读取到了另一个事务未提交的数据。当数据还在内存中没有写入硬盘,被读取,但是数据从内存中消失。
- 幻读:一个事务中,两次读取的数据数量不一致。这样是由于删除(delete)和添加(insert)造成的。比如A事务查询工资为1000的员工有5人,但是此时B事务插入一条1000工资的员工,则A读取的就变成了6条,从而造成了幻读。
- 不可重复读:A事务多次读取数据时,B事务对数据进行了修改,因而读到的数据不一致。也就是不可重复读。这个时由改(update)造成的。
为了解决上述三个并发问题。就要用到事务的隔离级别
- serializable(串行化):可以解决所有问题,但是效率低。也叫锁表。
- repeatable read(可重复读):可以解决脏读,不可复读。mysql默认这中级别
- read committed(读已提交):解决脏读。Oracle和SQL Server
- read uncommitted(读未提交):级别最低,任何都无法保证,效率最高,最不安全。
编程式事务
使用Java代码手动进行开启事务、提交事务、回滚事务。
编程式事务的三个相关类
1 PlatformTransactionManager
下图有详细的介绍。
我理解的就是一个平台事务管理器,每一种技术对事务的实现不同,就是说明这个事务时基于哪个平台的。
2 TransactionDefinition
定义事务属性的对象。
主要包含了事务的隔离级别和事务的传播行为
隔离级别
上面做了具体阐述
传播行为
3 TransactionStatus
声明式事务
AOP+编程式事务
xml配置声明式事务
- 配置平台事务管理器:spring不知道我们底层是用 的什么框架管理事务的。
- 为spring提供的通知配置对应的配置信息,指定哪些方法需要被如何增强
各个标签详解
- 织入
注解配置声明式事务
- 配置平台事务管理器
- 在要执行事务的方法和类上加@Transactionalzhujie
- 启用注解配置事务tx:annotation-driven/