4. Spring 事务
4.1 什么是事务?
将组操作封装成个执单元,要么全部成功要么全部失败。
- 为什么要事务?
如转账分为两个操作:第步操作:A 账户 -100 元,第步操作:B 账户 +100 元。如果没有事务,第步执成功了,第步执失败了,那么 A 账户平故的 100 元就“间蒸发”了。如果使事务就可以解决这个问题,让这组操作要么起成功,要么起失败。
4.1.1 事务特性
事务有4 特性(ACID):原性(Atomicity,或称不可分割性)、持久性(Consistency)
、致性(Durability)和隔离性(Isolation,称独性)。
- 原性:个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中
间某个环节。事务在执过程中发错误,会被回滚(Rollback)到事务开始前的状态,就像这个
事务从来没有执过样。- 致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写的资料必须完
全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以发性地完成预定的
作。- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
- 隔离性:数据库允许多个并发事务同时对其数据进读写和修改的能,隔离性可以防多个事务
并发执时由于交叉执导致数据的不致。事务隔离分为不同级别,包括读未提交(Read
uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
4.2 Spring 事务的实现
MySQL 中的事务使:
事务在 MySQL 有 3 个重要的操作:开启事务、提交事务、回滚事务。-- 开启事务 start transaction; -- 业务执? -- 提交事务 commit; -- 回滚事务 rollback;
4.2.1 Spirng 编程式事务
步骤:
- 开启事务(获取事务)
- 提交事务
- 回滚事务
SpringBoot 内置了两个对象:DataSourceTransactionManager 来开启事务、提交或回滚事务,TransactionDefinition 是事务的属性,在开启事务的时候需要将TransactionDefinition 传递进去从获得个事务 TransactionStatus。
示例:
@RestController
public class UserController {
@Resource
private UserService userService;
// JDBC 事务管理器
@Resource
private DataSourceTransactionManager dataSourceTransact