事务
事务的本质就是把多个 SQL 语句给打包成一个整体,要么全部执行,要么一个都不执行(atom原子性)
--开启事务
START TRANSACTION;
--阿里巴巴账户减少100
UPDATE account SET money = money - 100 WHERE name = '阿里巴巴';
--四十大盗账户增加100
UPDATE account SET money = money + 100 WHERE name = '四十大盗';
提交事务
COMMIT;
事务的四个特性:
- 原子性
- 一致性 事务修改前后,数据得是靠谱的
- 持久性 事务修改的内容是写到硬盘上的,持久存在,重启也不消失
- 隔离性 解决并发执行事务引起的问题
并发执行事务产生的问题:
问题 | 描述 |
---|---|
脏读 | 一个事务读取到另外一个事务还没有提交的数据 |
不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同 |
幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在了,好像出现了”幻影“ |
- 脏读:是指在数据库事务中,一个事务读取了另一个未提交事务中的数据。当一个事务修改数据但还没有提交时,另一个事务读取了这个未提交的数据。如果未提交的事务最终被回滚,那么另一个事务读取到的数据实际上是无效的或错误的,称作脏数据。脏读可能导致不一致的数据状态和不正确的结果。
MySQL引入了”写操作加锁“(read committed)机制来解决脏读问题,降低了并发程度,提高了隔离性
- 不可重复读:是指在数据库事务中,一个事务在相同的查询中多次读取同一行数据,但在这个过程中,另一个事务修改或删除了该行数据,导致两次读取的结果不一致。这种情况下,事务在多次读取之间发生了不一致的变化,从而产生了不可重复的结果。
MySQL引入了”读操作加锁“,读和写都锁(reeatable committed)机制来解决不可重复读问题,降低了并发程度,提高了隔离性
- 幻读:是指在数据库事务中,一个事务在相同的查询条件下多次执行查询,但在这个过程中,另一个事务插入、修改或删除了符合该查询条件的数据,导致多次查询的结果集发生变化。这种情况下,事务发现了一些之前不存在的行或丢失了一些之前存在的行,就好像发生了幻觉一样。
数据库使用”串行化“(serializable)这样的方法解决幻读彻底放弃并发处理事务,一个接一个的串行处理事务。这样做并发程度是最低的,隔离性是最高的
事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable Read | × | × | √ |
Serializable | × | × | × |
查看事务隔离级别
SELECT @@ TRANSACTION——ISOLATION;
设置事务的隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL
[READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]