黑马MySQL数据库从入门到精通-基础篇 事务

黑马MySQL数据库从入门到精通-基础篇 事务

事务

1
事务是一组操作的集合,这组操作,要么全部执行成功,要么全部执行失败。

事务操作

1
2
START TRANSACTION;--开启事务
COMMIT/ROLLBACK;--提交/回滚事务

并发事务问题

1
2
3
脏读:一个事务可以读取另一个事务未提交的数据
不可重复读:一个事务两次相同操作得到不同的结果(两次时间间隙有另一个事务进行数据操作)
幻读:例如一个事务查询没有对应数据(此时另一个事务进行数据插入),然后进行数据插入,提醒已有对应数据,但是查询也还是没有(可重复读实现)

隔离级别

1
2
3
4
read uncommit
read commit
repeatable read
serializable
1
2
3
4
5
					脏读		不可重复读		幻读
read uncommit v v v
read commit x v v
repeatable read x x v
serializable x x x
1
2
3
4
5
6
7
8
9
MySQL的默认事务隔离级别是 REPEATABLE READ。这意味着,在一个事务中,对某条记录的读取结果始终是一致的,不管其他事务是否对这条记录进行修改。但是,这个隔离级别可能会产生幻读(Phantom Read)的问题,即在一个事务内执行两次相同的查询,但由于另一个并发事务插入了新的满足查询条件的行,因此第二次查询返回了更多的行。

MySQL支持以下四种事务隔离级别:

READ UNCOMMITTED(读未提交):这是最低的事务隔离级别。它允许一个事务读取另一个未提交事务的修改。这可能导致脏读(Dirty Read)、不可重复读(Nonrepeatable Read)和幻读(Phantom Read)。
READ COMMITTED(读已提交):这是大多数数据库系统的默认隔离级别(但不是MySQL的默认)。它只能读取已经提交的数据。这可以防止脏读,但可能出现不可重复读和幻读。
REPEATABLE READ(可重复读):这是MySQL的默认隔离级别。它确保在同一事务中多次读取同一数据的结果是一致的。这可以防止脏读和不可重复读,但可能出现幻读。
SERIALIZABLE(串行化):这是最高的隔离级别。它通过强制事务串行执行,从而避免了脏读、不可重复读和幻读。但是,这可能会降低并发性能。
需要注意的是,虽然MySQL的默认隔离级别是REPEATABLE READ,但具体的数据库引擎(如InnoDB和MyISAM)可能会有所不同。例如,MyISAM不支持事务,而InnoDB则支持并默认使用REPEATABLE READ隔离级别。
1
数据越安全,但是性能越低,注意:事务隔离级别越高,