MySQL笔记
事务
多条mysql语句合并成一条事务,变成一个整体,要么全部执行成功,要么全部失败。
使用方式
方式一(推荐):
-
开启事务:
START TRANSACTION 或 BEGIN TRANSACTION; -
提交事务:
COMMIT; -
回滚事务:
ROLLBACK;
方式二:
-
查看事务提交方式
SELECT @@AUTOCOMMIT; -
设置事务提交方式,1为自动提交,0为手动提交,该设置只对当前会话有效
SET @@AUTOCOMMIT = 0; -
.......(此处注册相关语句到事务中)
-
提交事务
COMMIT; -
回滚事务
ROLLBACK;
四大特性ACID
- 原子性(Atomicity):事务是不可分割的最小操作但愿,要么全部成功,要么全部失败
- 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
并发事务问题
| 问题 | 描述 |
|---|---|
| 脏读 | 一个事务读到另一个事务还没提交的数据 |
| 不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同 |
| 幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在,好像出现欢迎 |
事务隔离级别
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| Read uncommit | 有 | 有 | 有 |
| Read committed | 无 | 有 | 有 |
| Repeatable Read(默认) | 无 | 无 | 有 |
| Serializable | 无 | 无 | 无 |
- Serializable 性能最低;Read uncommitted 性能最高,数据安全性最差
设置事务隔离级别:
SET
[ SESSION(当前会话) | GLOBAL(全局) ]
TRANSACTION ISOLATION LEVEL
{READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE };
这里最好去实践一下,可以帮助理解,以下是关于我的理解:
-
READ UNCOMMIT:两个事务完全并行,A事务会读取到B事务临时提交但并未COMMIT的数据。
-
READ COMMITTED:解决了脏读,A事务只会读取到已经COMMIT的数据。
-
REPEATABLE READ:解决了不可重复读,我理解为将开启事务时的数据作为数据源,从中查询,相当于快照,但是与此同时会出现幻读的情况,也就是在B事务已经COMMIT之后,A事务无法查询到B事务操作之后的数据,所以会导致信息不一致,比如说没有查询到id(主键)为3的数据,然后在这之后,B事务插入了id为3的数据,此时A事务再插入id为3的数据,就会出现错误,但是在A事务中,无论怎么查询,都不会查到id为3的数据。
-
SERIALIZABLE:让事务变成线性执行,相当于要排队来执行,与此同时,性能最差。