【SQL】MySQL中的存储引擎、事务、锁

存储引擎:

数据库管理系统(DBMS)使用数据存储引擎进行创建、查询、更新和删除数据。

MySQL5.5之前默认的存储引擎是MyISAM,5.5及之后版本默认的存储引擎是InnoDB。(my.ini中指定的)

  • MyISAM:不支持事务,不支持外键
  • InnoDB:支持事务,支持外键
  • 存储引擎是针对表来说的,可以通过alter改变表的存储引擎
  • InnoDB与MyISAM的最大区别是两点:InnoDB支持事务、支持行级锁

事务:

事务可以保证成批的SQL要么全部执行,要么全部不执行。

MySQL中只有InnoDB存储引擎才支持事务。

MySQL中默认是自动提交事务的,因此使用事务时要先禁止自动提交。

sql 复制代码
--禁止自动提交
set autocommit=0
--开启自动提交
set autocommit=1
sql 复制代码
--开启事务(可以使用begin或者start transaction)
begin
--执行多个SQL语句
update account set money = money-200 where id = 1
update account set money = money+200 where id = 2
--提交事务
commit

--回滚事务
rollback

事务的特性ACID:

  • 原子性(Atomicity): 事务是一个整体,要么全部成功,要么全部失败。
  • 一致性(Consistency): 事务之前和事务之后的状态都是"正确"的(满足业务合理性)
  • 隔离性(Isolation): 并发执行的两个事务之间相互隔离,互不影响(即使操作同一条数据也不应该互相影响)
  • 持久性(Durability): 事务一旦被成功完成,数据被永久存储,不能回滚

事务的隔离级别:(越向下隔离级别越高)

  • 脏读: A事务读取到B事务没有提交的数据
  • 不可重复读: A事务提交之前,读取的同一个数据值发生变化(B事务提交导致)
  • 幻读: A事务提交之前和提交之后,同一个数据值发生变化(A事务提交之前读到的数据值不会变化,提交之后才能读到B事务提交修改的数据)
事务隔离级别 解释 脏读 不可重复读 幻读
读未提交(read-uncommitted) 一个事务可以读取另一个事务未提交的数据
读已提交(read-committed)(Oracle默认) 一个事务要等另一个事务提交后才能读取数据
可重复读(repeatable-read)(MySQL默认) 事务开启后,不再允许修改操作,但可以读取数据
串行化(serializable) 各事务串行化顺序执行,互不影响,效率很低,一般不用

隔离级别的设置:

sql 复制代码
-- 查看隔离级别
show variables like '%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;

锁:

  • 按数据操作粒度划分:
    表锁:锁定整个表
    行锁:锁定当前操作行
  • 按数据操作类型划分:
    读锁(共享锁):多个读操作可以同时进行互不影响,同一个表读锁可以加多个,加了读锁后只能读,自己和其他人均不能修改
    写锁(排他锁):当前操作没完成前,其他人既不能写也不能读,同一个表写锁只能加一个
存储引擎 表级锁 行级锁
MyISAM 支持 不支持
InnoDB 支持 支持

加表锁

MyISAM存储引擎在查询语句(SELECT)前,自动给涉及的所有表加读锁,在更新语句(UPDATE、DELETE、INSERT)前,自动给涉及的表加写锁,一般不需要使用lock table命令给MyISAM表显式加锁。

sql 复制代码
-- 加读锁
lock table table_name read;
-- 加写锁
lock table table_name write;
-- 解锁
unlock tables;

加行锁

相关推荐
黎明破晓.8 分钟前
MySQL基础
数据库·mysql
电商API&Tina11 分钟前
【电商API接口】多电商平台数据API接入方案(附带实例)
运维·开发语言·数据库·chrome·爬虫·python·jenkins
秦明月1326 分钟前
EPLAN电气设计:图层导入与导出操作指南
数据库·经验分享·学习·学习方法·设计规范
奋斗べ青年.40 分钟前
【redis】了解redis的主从和集群搭建
数据库·redis·缓存
麦聪聊数据1 小时前
敏感数据安全吗?基于字段级血缘的 PII 数据全链路追踪
数据库·sql·安全
田里的水稻1 小时前
BI_双足机器人舞蹈动作的sim2sim和sim2Real(Gymnasium + Mujoco)
服务器·数据库·机器人
酸菜牛肉汤面1 小时前
15、联合索引是什么?为什么需要注意联合索引中的顺序?
数据库
在风中的意志1 小时前
[数据库SQL] [leetcode-511] 511. 游戏玩法分析 I
数据库·sql·游戏
一直跑1 小时前
UKB数据库/RAP平台批量下载数据教程
数据库·rap·ukb
AndyHeee1 小时前
【瑞芯微rk3576刷ubuntu根文件系统容量不足问题解决】
linux·数据库·ubuntu