mysql事务,隔离级别,sql优化

可重复读的实现

事务实现机制

mysql事务

事务的四大特性

1、原子性(Atomicity):最小单位,不可切割;
2、 一致性(Consistency):事务数据状态都是一致的,要么都成功,要么都失败,一条发生异常,集体回滚;
3、 隔离性(Isolation):事务和事务之间是互相隔离,互不干扰,一个事务的失败不影响其他事务的运行;
4、持久性(Durability):事务一旦提交,不可回退。

spring事务

@Transactional注解参数:
readOnly
该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)
rollbackFor
该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:
指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)
指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
rollbackForClassName
该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行务回滚。例如:
指定单一异常类名称:@Transactional(rollbackForClassName=“RuntimeException”)
指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,“Exception”})
noRollbackFor
该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:
指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)
指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
noRollbackForClassName
该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:
指定单一异常类名称:@Transactional(noRollbackForClassName=“RuntimeException”)
指定多个异常类名称:
@Transactional(noRollbackForClassName={“RuntimeException”,“Exception”})
propagation
该属性用于设置事务的传播行为
例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
isolation
该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置
timeout
该属性用于设置事务的超时秒数,默认值为-1表示永不超时

隔离级别

首先说说事务同时进行会出现的几种情况

1、脏读:(事务a读取到了事务b还未提交事务的数据,这个时候数据是完全不对的,必避免)
在这里插入图片描述
2、不可重复读(当事务b修改后未提交的这段时间是不能读数据的,在b事务没进行修改之前读取的数据为1000,修改后读取数据为900,数据不一致,针对数据的修改
在这里插入图片描述
3、幻读(张三李四操作同一张卡,他们都查询到卡日志记录为1,张三往里面充了100,插入新的充值记录,这是李四也看到这条记录,出现了幻读,读取和操作都在对方提交之后针对的是新数据的插入

如何解决:

设置隔离级别

在这里插入图片描述

1.读未提交(Read uncommitted):(可读到未提交的数据)
这种事务隔离级别下,select语句不加锁。此时,可能读取到不一致的数据,即“读脏 ”。这是并发最高,一致性最差的隔离级别。
2.读已提交(Read committed):(可读到已提交的数据)
可避免 脏读 的发生。在互联网大数据量,高并发量的场景下,几乎 不会使用 读未提交和读已提交两种隔离级别。
3.可重复读(Repeatable read):(同一事务,还未提交读取的数据是一致的)
在同一个事务内的查询都是事务开始时刻一致的
MySql默认隔离级别。可避免 脏读 、不可重复读 的发生。
4.串行化(Serializable ):
完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞、可避免 脏读、不可重复读、幻读 的发生

如果设置/查询mysql隔离级别:

–read-uncommitted:读未提交 --read-committed:读已提交 – repeatable-read:可重复读 --serializable:串行化
设置:set tx_isolation=‘repeatable-read’;
查询:select @@tx_isolation;

sql优化

避免全表扫描,让查询的数据行数尽可能少,只查出需要的。
查询条件上优先精确查找可以过滤很多不需要的数据,加索引可以加快速度的查出想要的数据。

1、可以先选择在连接上和where条件上选择加索引
2、可以已数据量较少的数据作为基表,基表基本会全表扫描
3、查询执行计划,根据执行计划扫描行数选择添加索引

索引失效:

没有查询条件,没有建立索引,隐式转换,索引列上有数学运算,索引列使用函数(abs绝对值等),数据量少的情况,or连接中有的条件没有索引,模糊查询%在前面,where条件范围值,<>等。

1、普通索引:仅加速查询
2、唯一索引:加速查询 + 列值唯一(可以有null)
3、主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
4、组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
5、全文索引:对文本的内容进行分词,进行搜索

查看sql执行计划

几个需要关注的点
在这里插入图片描述
type:
1、all 全表扫描
2、ref:查找条件列使用了索引而且不为主键和unique,不能保证查询数据的唯一。
3、ref_eq:查找条件列使用了主键或unique索引,查找出一个就停止查询,查询速度快。
4、const:常量。

参考文章:link1link2.如果侵权,请联系删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值