ToB企服应用市场:ToB评测及商务社交产业平台

标题: 4. 事务和锁 [打印本页]

作者: 数据人与超自然意识    时间: 2022-8-27 04:36
标题: 4. 事务和锁
目录

事务

  1. begin;   #开始事务
  2. ...
  3. rollback;  #回滚事务
  4. savepoint 回滚点;  #添加回滚点
  5. rollback to 回滚点; #回滚到指定回滚点
  6. ...
  7. commit; #提交事务
复制代码
并发三大问题

排他锁和共享锁

事务隔离

  1. # 查看事务隔离级别
  2. select @@transaction_isolation;
  3. # 设置事务隔离级别
  4. set global transaction ioslation level 隔离级别
复制代码
全局锁

全局锁就是对整个数据库实例加锁,即数据库中的所有表都将被加上锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。
  1. # 开启全局锁,全局锁只有读
  2. flush tables with read lock;
  3. # 解除全局锁
  4. unlock tables;
复制代码
表锁

表锁作用于某一张表,是MyISAM和InnoDB存储引擎支持的方式,是MyISAM的默认锁机制。
  1. # 添加写锁/读锁
  2. lock table 表名称 read/write;
  3. # 解锁
  4. unlock tables;
复制代码
为表添加写锁后,不能读取表中任何数据。
为表添加读锁后,不能修改表中任何数据。
行锁

仅InnoDB引擎支持行锁
  1. -- 添加读锁(共享锁), 只能在事务中使用
  2. select * from ... lock in share mode;
  3. -- 查询时添加写锁(排他锁)
  4. select * from ... for update;
  5. -- 更新时自动添加写锁
  6. update 表名 set xxx = xxx where xxx
复制代码
行锁的细分,了解一下就好。
记录锁

(Record Locks)记录锁, 仅仅锁住索引记录的一行,在单条索引记录上加锁。Record lock锁住的永远是索引,而非记录本身,即使该表上没有任何索引,那么InnoDB会在后台创建一个隐藏的聚集主键索引,那么锁住的就是这个隐藏的聚集主键索引。所以说当一条sql没有走任何索引时,那么将会在每一条聚合索引后面加写锁,类似于表锁,但原理上和表锁是完全不同的。
间隙锁

(Gap Locks)仅仅锁住一个索引区间(开区间,不包括双端端点)。在索引记录之间的间隙中加锁,或者是在某一条索引记录之前或者之后加锁,并不包括该索引记录本身。比如在 1、2中,间隙锁的可能值有 (-∞, 1),(1, 2),(2, +∞),间隙锁可用于防止幻读,保证索引间的不会被插入数据。
临键锁

(Next-Key Locks)Record lock + Gap lock,左开右闭区间。默认情况下,InnoDB正是使用Next-key Locks来锁定记录(如select … for update语句)它可以根据场景进行灵活变换:
场景转换使用唯一索引进行精确匹配,但表中不存在记录自动转换为 Gap Locks使用唯一索引进行精确匹配,且表中存在记录自动转换为 Record Locks使用非唯一索引进行精确匹配不转换使用唯一索引进行范围匹配不转换,但是只锁上界,不锁下界引擎间的锁机制

使用InnoDB的情况下,在执行更新、删除、插入操作时,数据库也会自动为所涉及的行添加写锁(排他锁),直到事务提交时,才会释放锁,执行普通的查询操作时,不会添加任何锁。而当不使用where语句时,行锁会升级为读锁。
使用MyISAM的情况下,在执行更新、删除、插入操作时,数据库会对涉及的表添加写锁,在执行查询操作时,数据库会对涉及的表添加读锁。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4