MySQL事务和锁
作者:互联网
文章目录
一. 事务
一组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 系统启动后,到现在总共等待的次数
标签:事务,隔离,行锁,ISOLATION,MySQL,数据,row 来源: https://blog.csdn.net/weixin_37536020/article/details/117811111