MySQL概述
基础篇
通用语法及分类
DCL
DQL
DML
DDL
函数
字符串函数
数值函数
日期函数
流程函数
约束
常用约束
外键约束
多表查询
多表关系
查询
内连接查询
外连接查询
自连接查询
联合查询
子查询
事务
进阶篇
存储引擎
性能分析
查看执行频次
慢查询日志
profile
explain
索引
索引结构
索引分类
语法
使用规则
设计原则
SQL 优化
插入数据
主键优化
order by优化
group by优化
limit优化
count优化
update优化(避免行锁升级为表锁)
视图
存储过程
触发器
锁
InnoDB 引擎
事务原理
MVCC
数据类型
权限一览表
图形化界面工具
事务 - MySql学习文档 - 笔下光年
网站首页
事务
事务是一组操作的集合,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 ### 基本操作: ```mysql -- 1. 查询张三账户余额 select * from account where name = '张三'; -- 2. 将张三账户余额-1000 update account set money = money - 1000 where name = '张三'; -- 此语句出错后张三钱减少但是李四钱没有增加 模拟sql语句错误 -- 3. 将李四账户余额+1000 update account set money = money + 1000 where name = '李四'; -- 查看事务提交方式 SELECT @@AUTOCOMMIT; -- 设置事务提交方式,1为自动提交,0为手动提交,该设置只对当前会话有效 SET @@AUTOCOMMIT = 0; -- 提交事务 COMMIT; -- 回滚事务 ROLLBACK; -- 设置手动提交后上面代码改为: select * from account where name = '张三'; update account set money = money - 1000 where name = '张三'; update account set money = money + 1000 where name = '李四'; commit; ``` ### 操作方式二: 开启事务: `START TRANSACTION 或 BEGIN TRANSACTION;` 提交事务: `COMMIT;` 回滚事务: `ROLLBACK;` 操作实例: ```mysql start transaction; select * from account where name = '张三'; update account set money = money - 1000 where name = '张三'; update account set money = money + 1000 where name = '李四'; commit; ``` 开启事务后,只有手动提交才会改变数据库中的数据。 ### 四大特性 - 原子性(Atomicity):事务是不可分割的最小操作但愿,要么全部成功,要么全部失败 - 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态 - 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行 - 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的 ### 并发事务 | 问题 | 描述 | | ------------ | ------------ | | 脏读 | 一个事务读到另一个事务还没提交的数据 | | 不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同 | | 幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在 | > 这三个问题的详细演示:https://www.bilibili.com/video/BV1Kr4y1i7ru?p=55cd 并发事务隔离级别: | 隔离级别 | 脏读 | 不可重复读 | 幻读 | | ------------ | ------------ | ------------ | ------------ | | Read uncommitted | √ | √ | √ | | Read committed | × | √ | √ | | Repeatable Read(默认) | × | × | √ | | Serializable | × | × | × | - √表示在当前隔离级别下该问题会出现 - Serializable 性能最低;Read uncommitted 性能最高,数据安全性最差 查看事务隔离级别: `SELECT @@TRANSACTION_ISOLATION;` 设置事务隔离级别: `SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }; ` SESSION 是会话级别,表示只针对当前会话有效,GLOBAL 表示对所有会话有效
上一篇:
子查询
下一篇:
进阶篇