【MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!-哔哩哔哩】
【阿里巴巴Java开发手册】https://www.w3cschool.cn/alibaba_java
MySQL是一个
客户端/服务器
,对于同一个服务器来说,可以u若干个客户端之连接,每个客户端与服务器连接上后,就可以称为一个会话(Session
)。每个客户端都可以在自己的会话中向服务器发送请求语句,一个请求语句可能是某个事务的一部分,也就是对于服务器来说可能同时处理多个事务,事务有隔离性
的特性,理论上在某个事务对某个数据进行访问
时,其他事务应该进行排队
,当该事务提交之后,其他事务才可以继续访问这个数据。但这样对性能影响太大
,我们即想保持事务隔离性,又想让服务器在处理访问同一数据的多个事务性能尽量高些
,那就看二者如何权衡取舍了。
对于两个事务Session A、Session B、Session A
读取
了已经被Session B更新但还没有被提交
的字段时。之后若Session B回滚
,Session A读取
的内容就是临时且无效的。
对于两个事务Seesion A、Session B,Session A
读取
了一个字段,然后Session B更新
了该字段。之后Session A再次读取
同一个字段,值就不同
了。那就意味着发生了不可重复读。
对于两个事务Session A、Session B,Session A从一个表中
读取
一个字段,然后Session B在该表插入
了一些新的行。之后,如果Session A再次读取
同一个表,就会多出几行,那就意味着发生了幻读。
READ UNCOMMITTED
:读未提交,该隔离级别,所有事务都可以看到其他未提交事务的执行结果。不能避免脏读、不可重复读、幻读。
READ COMMITTED
:读已提交,它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这是大多数数据库系统的默认隔离级别。可以避免脏读,但不可重复读、幻读问题仍然存在。
REPEATABLE READ
:可重复读,事务A在读到一条记录之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容。可以避免脏读、不可重复读,但幻读问题仍然存在。这是MySQL的默认隔离级别。
SERIALIZABLE
:可串行化,确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除的操作。所有的并发问题都可以避免,但性能十分低下。能避免脏读、不可重复读和幻读。
SQL标准
中规定,针对不同的隔离级别,并发事务可以发生不同严重程度的问题,具体情况如下:
脏写
怎么没涉及到?因为脏写这个问题太严重了,不论哪种隔离级别,都不允许脏写的情况发生。
不同的隔离级别有不同的现象,并有不同的锁和并发机制,隔离级别越高,数据库的并发性能就越差,4种事务隔离级别与并发性能关系如下:
不同的数据库厂商对SQL标准中规定的四种隔离级别支持不一样。比如,
Oracle
就支持READ COMMITTED(默认隔离级别)
和SERIALIZABLE隔离级别
。MySQL支持4种隔离级别,但与SQL标准中所规定的各级隔离级别允许发生的问题却有些出入,MySQL在REPEATABLE READ隔离级别
下,是可以禁止幻读的问题发生的。
MySQL的默认隔离级别为
REPEATABLE READ
,在MySQL8.0
中默认隔离级别为READ COMMITTED
。
# 查看隔离级别,MySQL5.7.20的版本及之后;
SHOW VARIABLES LIKE 'transaction_isolation';# 不同MySQL版本中都可以使用的;
SELECT @@transaction_isolation;