MySQL

事务

数据库中事务是一组操作,要么都执行,要么都不执行。

四个特性(ACID):InnoDB支持(MyISAM不支持这四个特性)

1、A(atomicity),原子性。指每个事务都是不可分割的工作单位,要么都执行成功,要么都执行不成功

2、C(consistency),一致性。事务将数据库从一种状态转变为另一种状态。事务开始前和结束后,数据库的完整性没有被破坏

3、I(isolation),隔离性。并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的,一般由锁来实现

4、(durability),持久性。一个事务被提交后,它对数据库的改变是持久的,即使数据库发生故障也不应该对其有任何影响

原子性、隔离性和持久性的存在是为了保障一致性

 

原子性的回滚机制

如何实现undo log?

在事务中,每一条SQL通过执行器后,第一时间就会在UNDO LOG SEGMENT 中申请一个UNDO LOG页,然后根据SQL信息构造对应的UNDO LOG内容同时将其写入磁盘,以保证每次操作真正数据之前UNDO LOG是完整的。这样即使发生异常也可以完美的撤销。

 

 

隔离性的一系列场景

脏读:事务A读取到了事务B还没有提交的数据

 

 

 

 

 

 

 

不可重复读:事务A两次读取同一条数据,在事务A两次读取的间隙,事务B对数据进行修改并提交,导致事务A两次读取到不一致的数据

幻读:事务A两次读取同一数据,在两次读取间隙,事务B删除或者增加了部分数据,导致事务A两次读取到了数量不一致的行数据

 

解决方案:四种隔离级别

 

封锁

封锁粒度

MySQL提供了两种封锁粒度,行级锁和表级锁。

应该只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,并发时发生锁争用的可能就越少,系统的并发程度越高

但是加锁需要消耗额外的资源

  • 封锁的粒度越大 数据库能够封锁的数据单元就越少,并发度就越小,系统开销也就越小
  • 封锁的粒度越小 数据库能够封锁的数据单元就越多,并发度就越高,系统开销也就越大

封锁类型

1.读写锁

互斥锁:简写X锁,又称写锁

共享锁:简写S锁,又称读锁

  • 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。
  • 一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。

 

 

索引

索引失效

1.在索引列上进行运算操作

explain select * from tb_user where phone = '17799990015';    不失效

explain select * from tb_user where substring(phone,10,2);       失效

2.字符串查询不加引号

explain select * from tb_user where phone = '17799990015';    不失效

explain select * from tb_user where phone = 17799990015;      失效

3.模糊查询(尾部模糊不会失效,头部模糊会失效)

explain select * from tb_user where profession like '软件%';    不失效

explain select * from tb_user where profession like '%工程';    失效

4.or 连接的条件

用or分隔开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及到的索引都不会被用到

explain select * from tb_user where id = '10' or age = 23;        失效

explain select * from tb_user where phone = '17799990015' or age = 23;        失效

5.mysql评估索引查询比全表更慢,走全表(受数据分布影响)

 

posted @ 2023-02-24 13:37  _Judge  阅读(69)  评论(0)    收藏  举报