并发务带来的问题
脏写(Dirty Write):如果一个事务修改了另一个未提交事务修改过的数据,那就意味着发生了脏写。

脏读(Dirty Read):如果一个事务读到了另一个未提交事务修改过的数据,那就意味着发生了脏读。

不可重复读(Non-repeatable Read):如果一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值,那就意味着发生了不可重复读。

幻读(Phantom):如果一个事务先根据某些条件查询出一些记录,之后另一个事务有向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来,那就意味发生了幻读。注意:幻读强调的是一个事务按照某个相同条件多次读取记录时,后读取时读到了之前没读到的记录。如果是后读取记录变少了,就不是幻读,相当于每一条记录都发生了不可重复读的现象。

幻读问题的产生是因为某个事务读了一个范围的记录,之后别的事务在该范围内插入了新记录, 该事务再次读取该范围的记录时,可以读到新插入的记录,所以幻读问题准确的说并不是因为读取 和写入一条相同记录而产生的。
事务的隔离级别
READ UNCOMMITTED: 未提交读
READ COMMITTED:已提交读
REPEATABLE READ :可重复读
SERIALIZABLE:可串行化
针对不同隔离级别,并发事务可以发生的问题不同:每个级别都不可能发生脏写
READ UNCOMMITTED(未提交读):可能发生脏读,不可重复读和幻读问题
READ COMMITTED(已提交读):可能发生不可重复读和幻读问题,但不可能发生脏读问题
REPEATABLE READ(可重复读):可能发生幻读问题,但不可能发生脏读和可重复读问题
SERIALIZABLE(可串行化):各种问题都不可能发生
MySQL 虽然支持4种隔离级别,但与 SQL标准 中所规定的各级隔离级 别允许发生的问题却有些出入,MySQL在REPEATABLE READ(可重复读)隔离级别下,是可以禁止幻读问题的发生的

MySQL 的默认隔离级别为 REPEATABLE READ(可重复读)
查看隔离级别
- show variables like 'transaction isolation';
- -- 或者
- select @@transaction_isolation-
我们可以手动更改事务的隔离级别:
set [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL (级别);
设置事务的隔离级别的语句中,在 SET 关键字后可以放置 GLOBAL 关键字、 SESSION 关键字或者什么都不放,这 样会对不同范围的事务产生不同的影响,具体如下:
使用GLOBAL关键字(在全局范围影响):只对执行完该语句之后的会话起作用,当前已经存在的会话无效
使用SESSION关键字(在会话范围影响):对当前会话的所有后续的事务有效;该语句可以在已经开启的事务中间执行,但不会影响当前正在执行的事务,如果在事务之间执行,则对后续的事务有效。
两个关键字都不使用(只对执行语句后的下一个事务产生影响):只对当前会话中下一个即将开启的事务有效;下一个事务执行完后,后续事务将恢复到之前的隔离级别;该语句不能在已经开启的事务中间执行,会报错。