前言

这是一篇关于MySQL数据库索引的文章。该文章是黑马程序员—MySQL数据库入门到精通视频的归纳总结和补充,同时也引用了公共仓库 - 智云知识Java Guide的部分内容,仅用于个人技术归档和技术分享。

事务简介

事务是一组操作的集合,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

事务操作

有两种方式去手动控制事务。当事务成功,我们提交事务;当事务出现异常,回滚事务

操作方式一

查看/设置事务提交方式

1
2
3
4
-- 查看事务提交方式
SELECT @@AUTOCOMMIT;
-- 设置事务提交方式,1为自动提交,0为手动提交,该设置只对当前会话有效
SET @@AUTOCOMMIT = 0;-- 提交事务COMMIT;

提交事务

1
2
-- 提交事务
COMMIT;

回滚事务
1
2
-- 回滚事务
ROLLBACK;

操作方式二

开启事务

1
2
3
START TRANSACTION
-- 或者
BEGIN TRANSACTION;

提交事务

1
COMMIT;

回滚事务

1
ROLLBACK;

操作实例

1
2
3
4
5
start transaction;
select * from account where name = '张三';
update account set money = money - 1000 where name = '张三';
update account set money = money + 1000 where name = '李四';
commit;

事务特性ACID

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败
  • 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

事务并发问题

问题 描述
脏读 一个事务读到另一个事务还没提交的数据
不可重复读 一个事务先后读取同一条记录,但两次读取的数据不同
幻读 一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在

事务隔离级别

概念

隔离级别 脏读 不可重复读 幻读
Read Uncommitted(读取未提交)
Read Committed(读取已提交) ×
Repeatable Read(可重复读) 默认 × ×
Serializable(可串行化) × × ×
  • √表示在当前隔离级别下该问题会出现
  • Serializable 性能最低,数据安全性最高;
  • Read uncommitted 性能最高,数据安全性最差

只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的

操作

查看事务隔离级别

1
SELECT @@TRANSACTION_ISOLATION;

设置事务隔离级别

1
2
-- SESSION 是会话级别,表示只针对当前会话有效,GLOBAL 表示对所有会话有效
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE };