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事务和锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程