MySQL事务和锁
2021/6/11 19:51:11
本文主要是介绍MySQL事务和锁,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 一. 事务
- 二. 并发问题
- (1) 更新丢失
- (2) 脏读
- (3) 不可重复读
- (4) 幻读
- 三.事务隔离级别
- 四.表锁
- 五.行锁
- 行锁升级表锁
- 六.间隙锁
- 七.相关变量
- ① autocommit
- ② TX_ISOLATION
- ③ table_locks%
- ④ innodb_row_lock%
一. 事务
一组SQL语句组成的逻辑处理单元,通常具有ACID属性
属性 | 解释 |
---|---|
原子性 | 事务是一个原子操作单元,其对数据库的修改,要么全部执行,要么全部不执行 |
一致性 | 事务开始和完成时,数据都必须保持一致状态 |
隔离性 | 事务在不受外部并发操作影响的独立环境下运行 |
持久性 | 事务完成后,其对数据的修改是永久性的 |
二. 并发问题
(1) 更新丢失
事务A和事务B同时更新同一行数据。由于每个事务都不知道其它事务的存在,就会发生丢失更新问题 ---- 最后的更新覆盖了由其它事务所作的更新
(2) 脏读
事务A读取到了事务B已修改但未提交的数据,还在这个数据基础上做了操作,此时,如果回滚了事务B,事务A读取到的数据无效,违反了事务一致性属性
(3) 不可重复读
事务A在读取事务B的数据后,事务B又对该数据做了修改,导致事务A前后两次读取到的数据不一样,违反了事务隔离性属性
(4) 幻读
事务A按相同的查询条件重新读取以前检索过的数据,却发现事务B插入了满足其查询条件的新数据。
三.事务隔离级别
隔离级别 | 读数据一致性 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
未提交读 | 最低级别,只能保证不读取物理上损坏的数据 | √ | √ | √ |
已提交读 | 语句级 | × | √ | √ |
不可重复读 | 事务级 | × | × | √ |
可串行化 | 最高级,事务级 | × | × | × |
数据的数位隔离级别越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上“串行化”进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏感,可能更关心数据并发访问能力
四.表锁
加写锁,会阻塞其它进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作
加读锁,会阻塞其它进程对同一表的写操作,不阻塞写操作。只有当读锁释放后,才会执行其它进程的写操作
五.行锁
行锁支持事务
给某一行加锁
SELECT XXX FROM … WHERE … FOR UPDATE
行锁升级表锁
① 无索引行锁升级为表锁,索引列varchar类型自动转换为整型
六.间隙锁
当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”。
间隙锁有一个比较致命的弱点,就是当锁定一个范围键值之后,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。在某些场景下这可能会对性能造成很大的危害
七.相关变量
① autocommit
隐式事务没有明显开始和结束标记,用在一条语句,自动提交功能开启
显示事务具有明显开启结束标记,用在语句块,自动提交功能禁用
查看自动提交功能是开启,还是关闭
SHOW VARIABLES LIKE ‘autocommit’;
设置自动提交功能关闭
SET AUTOCOMMIT = 0
SET TRANSACTION
…
设置恢复点
SAVEPOINT SP
…
手工提交事务
COMMIT
或者回滚事务
ROLLBACK SP
② TX_ISOLATION
查看当前事务的隔离级别
SHOW VARIABLES LIKE ‘TX_ISOLATION’;
设置事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE-READ
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE
③ table_locks%
查看表锁定
SHOW OPEN TABLES;
分析表锁定
SHOW STATUS LIKE ‘table_locks%’;
Table_locks_immediate 表锁定的次数
Table_locks_waited 表锁定争用而发生等待的次数
④ innodb_row_lock%
SHOW STATUS LIKE ‘innodb_row_lock%’;
Innodb_row_lock_current_waits 当前正在等待锁定的数量
Innodb_row_lock_time 从系统启动到现在锁定总时间长度
Innodb_row_lock_time_avg 每次等待所花平均时间
Innodb_row_lock_time_max 从系统启动到现在等待最长的一次所花的时间
Innodb_row_lock_waits 系统启动后,到现在总共等待的次数
这篇关于MySQL事务和锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-04-26MySQL查出时间比实际晚8小时的解决方案
- 2024-04-01JPA不识别MySQL的枚举类型
- 2024-03-30mysql数据库表卡死解决方法
- 2024-03-15MySQL多数据源笔记5-ShardingJDBC实战
- 2024-03-11natural join mysql
- 2024-03-11关于VS2017,VS2015 中利用 EF使用Mysql 不显示数据源问题解决方案
- 2024-02-26mysql 阿里云xb后缀备份文件恢复-icode9专业技术文章分享
- 2024-02-22docker mysql 5.7
- 2024-02-18从 20 多套 MySQL 到 1 套 TiDB丨骏伯网络综合运营管理平台应用实践
- 2024-02-07mysql 外键索引入门介绍,为什么工作中很少有人使用?