1.事务
1.1 事务的概念
事务是⼀组操作的集合, 是⼀个不可分割的操作.
事务会把所有的操作作为⼀个整体, ⼀起向数据库提交或者是撤销操作请求.
所以这组操作要么同时成功, 要么同时失败.
1.2 需要事务的原因
- 转账的时候,要么同时成功,要么同时失败;若不是,会使用户有资金损失
- 秒杀系统
1.3 事务的操作
事务的操作主要有三步:
1.
开启事务:start transaction/ begin (⼀组操作前开启事务)
2.
提交事务: commit (这组操作全部成功, 提交事务)
3.
回滚事务: rollback (这组操作中间任何⼀个操作出现异常, 回滚事务)
2. Spring 中事务的实现
Spring 中的事务操作分为两类:
1.
编程式事务(⼿动写代码操作事务).
2.
声明式事务(利⽤注解⾃动开启和提交事务).
在学习事务之前, 我们先准备数据和数据的访问代码
需求: ⽤⼾注册, 注册时在⽇志表中插⼊⼀条操作记录.
数据准备:
DROP DATABASE IF EXISTS trans_test;
CREATE DATABASE trans_test DEFAULT CHARACTER SET utf8mb4;
USE trans_test;
-- 用户表
DROP TABLE IF EXISTS user_info;
CREATE TABLE user_info (
`id` INT NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR (128) NOT NULL,
`password` VARCHAR (128) NOT NULL,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARACTER
SET = utf8mb4 COMMENT = '用户表';
-- 操作日志表
DROP TABLE IF EXISTS log_info;
CREATE TABLE log_info (
`id` INT PRIMARY KEY auto_increment,
`user_name` VARCHAR ( 128 ) NOT NULL,
`op` VARCHAR ( 256 ) NOT NULL,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now() ON UPDATE now()
) DEFAULT charset 'utf8mb4';
代码准备:
1.
创建项⽬ spring-trans, 引⼊Spring Web, Mybatis, mysql等依赖
2.
配置⽂件
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/trans_test?characterEncoding=utf8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
configuration: # 配置打印 MyBatis⽇志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true #配置驼峰⾃动转换
3.
实体类


4.
Mapper


5.
Service


6.controller

2.1 Spring 编程式事务
Spring ⼿动操作事务和上⾯ MySQL 操作事务类似, 有 3 个重要操作步骤:
•
开启事务(获取事务)
•
提交事务
•
回滚事务
SpringBoot 内置了两个对象:
1.
DataSourceTransactionManager
事务管理器.
⽤来获取事务(开启事务), 提交或回滚事务
2.
TransactionDefiniti