原创 PowerData-老崔 PowerData
作者介绍
背景介绍
数据库事务:Database Transaction
数据库事务是指最为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性、持久性)属性。
01 事务
事务概念
事务主要目的是用于保证数据的一致性。mysql的事务是一组在数据库中执行的操作,他们要么全部成功执行要么全部失败,不会出现部分成功的情况。
事务的四大特性(ACID)
- 原子性:一个事务必须被视为一个不可分割的工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败。
- 一致性:数据库总是从一个一致性状态转换到下一个一致性状态。如果事务最终没有提交,该事务所做的任何修改都不会被保存到数据库中,换句话说就是经过事务的数据必须达到预期的结果。
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
- 持久性:一旦提交,事务所做的修改就会被永久保存到数据库中。此时即使系统崩溃,数据也不会丢失。
事务的隔离级别类型
- 未提交读:也称之为脏读事务可以读取其他事务未提交的数据对象。
- 提交读:事务可以读取其他事务已提交的数据对象,读完后此数据可以被其他事物再读写可能会出现幻读。
- 重复读:事务可以读其他事务已提交数据对象,读完后此数据对象不可以被其他事务再写但可以读,直到此事务结束,它可以解决脏读但是可能会出现幻读。
- 可串行化:事务读之前,其他事务已提交的数据对象对此事务可见,读完后整个多粒度树只读不能写,直到事务结果。
脏读、幻读、不可重复读
- 脏读:是读到了其他事务未提交的数据,未提交意味着这些数据可能会保存到数据库,也可能会回滚,不保存到数据库。当这个数据发生了回滚,就意味着这个数据不存在,这就是脏读。
- 幻读:幻读和不可重复读,有点类似,例如A事务修改在修改数据时,B事务突然插入数据并进行的提交,此时A事务修改完成,读取全部数据时会发现有一条数据没有更新,这就是幻读。
- 不可重复读:指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况。
Mysql架构
02 Mysql锁机制
Mysql锁机制定义
Mysql的锁机制,是保障多个并发事务同时访问数据库的数据时保证数据一致性的重要手段。
Mysql锁的分类
Mysql锁的详解
乐观锁:
假设并发操作时不会发生冲突,只在提交事务时检查数据是否被其他事务修改过。常用于读多写少的场景。
悲观锁:
假设并发操作时会发生冲突,因此在操作期间持有锁来避免冲突。常用于写多读少的场景。
全局锁:
对整个数据库实例加锁,限制除了超级用户外的所有查询和修改操作。一般用于备份、恢复等操作。
表级锁:
对整个表加锁,其他连接无法修改或读取该表的数据,但可以对其他表进行操作。
页级锁:
对数据页(通常是连续的几个行)加锁,控制并发事务对该页的访问。适用于数据较大且并发量较高的场景。
行级锁:
对单个行加锁,只锁定需要修改的数据行,其他行可以被同时修改或读取。并发性高,但锁管理较复杂。
共享锁:
也称为读锁,多个事务可以同时持有共享锁并读取数据,但不能修改数据。适用于同时读取同一数据的场景。
排他锁:
也称为写锁,事务持有排它锁时,其他事务无法同时持有共享锁或排它锁,用于保护数据的写操作。
意向共享锁:
表级锁的辅助锁,表示事务要在某个表或页级锁上获取共享锁。
意向排他锁:
表级锁的辅助锁,表示事务要在某个表或页级锁上获取排它锁。
间隙锁:
锁定一个范围的键,但不包括这些键的实际值。用于防止其他事务在范围内插入数据。
临建锁:
锁定数据库对象的元数据,如表结构,用于保证数据定义的一致性。
记录锁:
行级锁的特定类型,锁定单个行,确保其他事务无法同时修改或读取该行。
不同的场景可以合理组合使用不同的锁类型,具体的应当按照需求来选取,保证数据的一致性和并发性。
03 死锁
死锁可能的原因
- 语句运行时间过长,导致其他查询无法执行
- 并发操作过多,导致了表或行锁定
- 多事务之间相互等待对方释放资源
常见解决方法
- 优化语句,减少查询时间
- 合理设置超时时间
- 限制并发,避免锁表或锁行
- 主动锁表,加以控制
- 使用事务,保证数据的一致性和完整性
常见执行语句
查看进行中的事务
select * from information_schema.INNODB_TRX;
查看正在锁的事务
select * from information_schema.INNODB_LOCKS;
查看等待锁的事务
select * from information_schema.INNODB_LOCKS;
查询是否锁表
show open tables where In_use > 0;
查看最近死锁日志
show engine innodb status;
- 暴力解除死锁方式
- 查看当前进行的进程:
show processlist;
- kill 进程
最终还是要在代码或配置方面入手优化
利用 flink retract 计算长生命周期下跨业务状态指标
我们是由一群数据从业人员,因为热爱凝聚在一起,以开源精神为基础,组成的PowerData数据之力社区。
如果你也想要加入学习,可关注下方公众号后点击“加入我们”,与PowerData一起成长!
- END -
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。