【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;

加行锁

相关推荐
姚远Oracle ACE8 小时前
解读Oracle AWR报告:Global Cache and Enqueue Services - Workload Characteristics
数据库·oracle
流星白龙8 小时前
【Qt】7.信号和槽_connect函数用法(2)
java·数据库·qt
Zzz 小生11 小时前
Claude Code学习笔记(四)-助你快速搭建首个Python项目
大数据·数据库·elasticsearch
nongcunqq14 小时前
abap 操作 excel
java·数据库·excel
rain bye bye15 小时前
calibre LVS 跑不起来 就将setup 的LVS Option connect下的 connect all nets by name 打开。
服务器·数据库·lvs
冻咸鱼15 小时前
MySQL的配置
mysql·配置
阿里云大数据AI技术16 小时前
云栖实录|MaxCompute全新升级:AI时代的原生数据仓库
大数据·数据库·云原生
不剪发的Tony老师16 小时前
Valentina Studio:一款跨平台的数据库管理工具
数据库·sql
重生之我要当java大帝17 小时前
java微服务-尚医通-编写医院设置接口下
java·开发语言·sql
weixin_3077791317 小时前
在 Microsoft Azure 上部署 ClickHouse 数据仓库:托管服务与自行部署的全面指南
开发语言·数据库·数据仓库·云计算·azure