一、思考

保存员工的基本信息(emp)成功了,市而保存工作经历(emp_expr)失败了,是否OK?
不可以
保存员工信息成功了,保存工作经历失败了会造成数据库数据不完整、不一致,很严重
所以用到了新的技术点 - 事务管理

4-25上午
什么是事务?
一组操作的集合,要么一起成功要么一起失败
注意:默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。

如何控制事务?
事务控制主要三部分:开启事务、提交事务/回滚事务
day03 新增员工功能

场景?
银行转账、下单扣减库存

代码实现事务管理(后续补上)

4-25下午
1.Spring事务管理:一组操作的集合,要么一起成功要么一起失败
(1)注解: @Transactional
加在方法上面开启事务
(2)属性:@Transactional(rollbackFor = Exception.class)
点一:默认是RuntimeExcetion,所以有时候看不到事务的控制是因为异常范围
点二:事务的传播行为
REQUIRED:大部分场景
REQUIRES_NEW:希望两个方法在独立的事务中运行,互不影响
day03 新增员工功能

day03 新增员工功能
(3)事务4大特征和事务常出现的几个问题(通过设置事务隔离级别解决)
原子性、一致性、隔离性、持久性
day03 新增员工功能

2.总结
并发事务会出现的问题(面试常问!!!记住)
1、什么是事务?
2、项目中怎么处理事务的?在方法上加注解@Transactional
3、即使有这个@TransactionaL注解是否有事务也不生效的情况?
1、异常范围捕获的不对
2、事务的传播行为
4、事务的特征?
ACID:原子性一致性隔离性持久性
5、并发事务会有哪些问题?
脏读(读取到了别的事务未提交的数据)
不可重复读(同一个事务下两个查询语句看到的结果不一样)
幻读(两个查询到的数据的数量不一致)
6、怎么解决并发事务的问题?
设置隔离级别
读未提交 什么问题都没解决
读已提交 脏读
可重复读(mysqL默认) 不可重复读脏读
串行化 幻读 不可重复读 脏读

day03 新增员工功能
day03学习记录

三块内容:

​ -员工新增

​ -事务管理

​ -文件上传

一、员工新增功能

1.写功能的规则:

​ 第一点: API 文档分析(请求方式、参数、返回值已统一可略)

​ 一个表对应一个实体类对应一个Mapper,

​ 一个Service可以注入多个mapper,

​ 一个Controller可以注入多个Service

​ 第二点: sql 表编写

​ 员工表、员工经历表

​ 第三点: 写业务功能的思路

      (1)根据API接口文档写Controller

​ (2)Service做业务处理 (1.设置默认值 2. 保存员工表 3. 保存员工工作经历表)

​ (3) Mapper中mybatis的动态SQL

<where>

<if>

<foreach collection='变量名' item="对象别名" separator>

<set> 

sql片段

<inclued>

二、事务管理

第一点概念:一组操作的集合,要么全部成功,要么全部失败

第二点: 怎么控制事务?

​ begin;

​ 执行SQL;

​ commit/rollback

第三点: (1)项目中控制事务的方式是在方法上面加注解 @Transactional

​ (2)@Transactional 上可以添加属性

​ rollbackfor : 控制异常的范围 Exception.class

​ propagation: 控制事务传播行为

​ 默认是REQUIRED: (方法一点要以事务方式运行)

​ REQUIES_NEW: 会创建自己的事务

第四点(★★★)

面试题

1、什么是事务

2、事务的特征

3、项目中怎么控制事务

4、注解上可以添加什么属性

5、并发事务会有什么问题

6、怎么解决并发事务的问题

三、文件上传

第一点

基本知识

​ 前端:3要素 1、请求方式一定是post 2、enctype=mutilpart/data 3 、input的type类型是File

​ 后端接收文件 MultiPartFile

第二点

本地保存

​ (1) MultiPartFile提供的transterTo

​ (2) 注意:修改文件名

阿里云OSS文件存储

1、开通账号

2、创建AccessKey

3、创建bucket

4、从官网上拷贝的

补充文件上传优化:
当阿里云上传文件配置内容过多时,有两种方法将配置代码统一起来方便后期维护。
@Value注解->适用于配置内容较少的情况,后期方便修改内容
@ConfigurationPropertie注解 ->适用于配置内容较多的情况,直接getset调用即可