事务
事务控制
方式一:set autocommit = 0
方式二:START TRANSACTION 或 BEGIN
都是手动提交commit,手动回滚rollback
Springboot中事务控制
@Transactional注解:
在Spring Boot中推荐使用@Transactional注解来申明事务。
- 首先需要导入JDBC依赖
- 在Service层中添加@Transactional注解
- @Transactional注解既可以标注在类上也可以标注在方法上
业务场景举例:
经典的银行转账问题,Dao层两个@update,一个增一个减,Service层中不光注入了转账的Dao,还注入了积分相关的Dao,这一系列操作是一个事务,所以需要在Service层or其下对应的方法使用注解@Transactional
注解属性
- rollbackFor:触发回滚的异常类型设定
- isolation:事务的隔离级别设定
- timeout:超时回滚
举例:
@Transactional失效
失效参考案例
最常见的失效是:在事务内部把异常给捕获了,举个例子
应该在最外层(控制层)进行异常捕获,保证事务的开启只有一条语句
事务四大特性
并发事务问题
- 赃读:一个事务读到另外一个事务还没有提交的数据
- 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读
- 幻读:(读时没有,插时有)一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 “幻影”。
事务的4个隔离级别
事务隔离级别越高,数据越安全,但是性能越低
存储引擎
- 存储数据,建立索引,增删改查
- 基于表,而非基于库
- Mysql默认引擎是InnoDB
mysiam使用的常见被nosql:mongodb替代
memory也是一样被nosql:redis取代
查看设置引擎
查看:SHOW ENGINES
设置:CREATE TABLE xxx()ENGIENS = MyISAM
默认:InnoDB
- 可靠性(行锁+事务+外键),高性能(B+树)
- 支持事务,DML操作遵循ACID模型
- 行级锁,提高并发访问性能
- 支持外键,保证数据完整性和正确性
早期:MyISAM
面试题:
足迹,评论,点赞这种非核心数据 可以用myisam,偶尔丢点数据也没事