mysql基础--事务
mysql基础--事务
用于保持数据的一致性,它由一组相关的dml语句组成,该组成的dml语句要么全部成功,要么全部失败,如转账就要用事务来处理,用以保证数据的一致性
-
事务和锁
当执行事务操作时,mysql会在表上加锁,防止其他用户改表的数据,这对用户非常重要
-
ACID
- 原子性(Atomicity):事务是不可分割的工作单位,要么都发生,都么都不发生
- 一致性(Consistency):必须使数据库从一个一致性状态变换到另外一个一致性状态
- 隔离性(Isolation):多个用户并发访问数据库时,为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
- 持久性(Durability):指一个事务一旦被提交,它对数据的改变就是永久性的,即使后续数据库故障,也不该对它有任何影响
-
重要操作
- start transaction -- 开始一个事务
- savepoint 保存点名-- 设置保存点
- rollback to -- 保存点名- 回滚至保存点
- rollback -- 回退全部事务
- commit -- 提交事务,所有操作生效,不能回退
-
细节
- 默认情况下,dml操作是自动提交的,也就是实时commit
- 如果开始一个事务,但是没有创建保存点,你可以执行rollback,默认就是回退到事务开始状态
- 在事务中可以设置多个保存点
- 未提交前可以退回到任意保存点,但是选择了前面的保存点,后面的保存点就无法使用了
- 事务机制需要在innodb的存储引擎下使用,myisam不能用
- 开始一个事务可以使用:1. start transaction 2.set autocommit=off
-
隔离级别
-
概念
-
多个链接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性
-
如果不考虑隔离性,可能会引发:
脏读:当一个事务读取另一个事务尚未提交的修改时产生
不可重复读:同一个查询在同一事务中多次进行,由于其他事务所做的修改或删除,每次返回不同的结果集,此时发生(少了,或同一条数据不一致)
幻读:同一个查询在同一事务中多次进行,由于其他事务所做的插入,每次返回不同的结果集,此时发生(多了新数据)
-
-
级别(建立在事务下,没有事务就没有隔离级别)
- 读未提交:一个事务操作中可以被其他事务未提交的数据所影响,就是看到未提交的数据
- 读已提交:一个事务操作中可以被其他事务提交的数据所影响,就是看到提交的数据
- 可重复读:一个事务操作中不会被其他事务修改后的数据所影响,它只会操作自己开启事务时的数据,类似虚拟环境
- 可串行化:一个事务操作中如果发现其他事务也在对同一张表操作未提交,会等对方结束,再进行自己的操作
-
-
代码示范
mysql默认事务级别时repeatble read,一般情况无需修改,满足大部分项目需求
-- 查看当前会话事务隔离级别 select @@tx_isolation; -- 查看系统当前的隔离级别 select @@globa.tx_isolation -- 设置当前会话隔离级别为(read uncommitted) set session transaction isolation level read uncommitted -- 设置系统当前隔离级别为(read uncommitted) set session transaction isolation level read uncommitted
-
全局修改
修改安装目录下my.ini配置文件,在最后加上如下
[mysqld] transaction-isolation = REPEATABLE-READ
值可选参数有:READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ,SERIALIZABLE
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南