1 隔离级别:低级别的隔离通常可以执行更高的并发,系统 开销也更低

2 Read uncommitted:事务可以读取未提交的数据,脏读,应少用

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

3 read committed:不可重复读,事务只能看见已提交的事务所做的修改,大多数数据库使用这一级别,mysql不是

4 repeatable read: 可重复读,在同一个事务中多次读取同样记录结果是一致的。可能幻读:指当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该 范围内的记录时,会产生幻行。

mysql 默认的事务隔离级别

5 serializable:可串行化 ,会在读取的每一行数据上加锁,可能导致大量的超时和锁争的问题。是最高的隔离级别,通过强制事务串行执行,避免了前面说的幻读的问题。

实际少用,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下才考虑

6 锁:两个或多个事务在同一资源上相互占用,并请求锁对方占用的资源,多个事务试图以不同的顺序锁定资源时或多个事务同时锁定一个资源时,产生死锁。

innoDB处理方式:将持有最少行级排他锁的事务进行回滚

锁的行为和顺序是和存储引擎相着的。以同样的顺序执行语句,有些引擎会产生死锁,有些则不会。死锁产生有双重原因,有些是真正的数据冲突,难避免,有些则是由于存储引擎的实现方式导致的。

打破死锁:部分或全部回滚其中的一个事务

7 mysql提供了两种事务型的引擎:innoDB NDBCluster

第三方存在引擎 :xtraDB PBXT

自动提交:mysql默认采用自动提交模式,可以用show variables like 'autocommit'; 可看,set autocommit=1 ; 开启

1 或者 on 表示 启用;0 或 off 表示禁用

autocommit=0时,所有的查询都是在一个事务中,直到显式的执行commit 提交或rollback回滚该事务结束同时又开始一个新的事务。

对于非事务型的表:myisam或 内存表,不会有影响,一直处于autocommit启用模式,另外有些伪命令在执行前会强制执行commit提交当前事务:alter table .lock table

mysql可以通过执行 set transaction isolation level命令设置隔离级别,新的隔离级别会在下一个事务开始时生效,可以在配置文件中设置整个数据库的隔离级别,也可以只改变当前会话的隔离级别

set session transaction isolation level read committed 

mysql能够识别所有的4个ANST隔离级别,InnoDB引擎也支持所有的隔离级别

8 在事务中混合使用存储引擎:mysql服务器层不管理事务,事务是由下层的存储引擎实现的。所以在同一事务中,使用多种存储引擎是不可靠的。回滚时非事务型的表上的变更不能被回滚。

 9 Innodb 采用2阶段锁定协议,在事务执行过账中,随时都可以执行锁定,锁只有在执行commit或者rollback的时候才会释放,并且所有的锁是在同一时刻被释放。innodb会根据隔离级别在需要的时候自动加锁

innodb也支持通过特定的语句显式锁定,这些语句不属于sql规范:select ....lock inshare mode; select ... for update

mysql 也支持lock tables unlock tables 语句,这是在服务器层实现的,和存储引擎无关。不册 替代事务处理。

innodb的行级锁工作得比lock table语句好。在innodb中的可以去掉lock table语句

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄