innodb锁和事务是区别于myisam
事务特点acid
事务并发的问题
事务隔离级别用来解决事务并发问题
事务日志redo-log和undo-log
考察锁的前提是:多个事务并发的访问同一个数据,需要加锁来保证数据库一致性。
===什么是事务?
多条数据库操作要么全部执行,要么全部撤销。
===事务的四个特性ACID,最重要的是要保证什么?
A:原子性,保证事务的多个操作是一个不可分割的原子操作。要么全部执行要么全部撤销。通过事务回滚和undo-log以及MVCC多版本控制来保证原子性
C:一致性。事务操作之后保证数据不被破坏,保证数据库一直处于一致性的状态。
i:隔离性。多个并发的事务之间互相不干扰。
d:持久性:事务提交之后要持久化到数据库中。mysql通过redo-log去记录每个提交的事务并且持久化到磁盘中。
目的:最重要的是保证数据一致性。
===事务并发可能出现的问题?读数据问题和写数据问题分类?
并发问题发生就是因为没有给数据访问上锁导致的,就是读写操作并行执行导致的问题,同时也是事务没做同步会出现的问题。
-----读数据问题:三种,脏读,不可重复读和幻读
脏读:读取的数据是脏的,其实就是a事务读取到b事务未提交的更改数据。a事务读取b事务修改后未提交的数据,a事务提交,b事务回滚,说明a事务读取到了无效的数据。
不可重复读:a事务读取到b事务提交的更改数据。意思是a事务重复读数据会出错,比如A事务前后读同一个数据的时候,B事务恰好修改数据,那么A重复读取的数据就会前后不一致就会出错。这里重点在这个数据是更改或者删除的数据,所以必须加上行级锁。
幻读:a事务读取到b事务提交的新增数据。这个时候加表级锁防止新增数据。
-----两种更新操作问题:丢失更新问题
a事务覆盖了b事务的更新
第一类数据丢失:
a事务回滚,导致b事务提交的更新数据丢失。
第二类数据丢失:
a事务提交,导致b事务提交的更新被覆盖。
===事务隔离级别
为了解决事务并发条件下的问题,使用一定的事务隔离级别去处理。
四种隔离级别,隔离级别越高,能够避免的并发读问题就越多,并发能力就越弱。
现在来看看MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。说明a事务读的时候 ,b事务不能改不能插入新的数据。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。a事务读的时候,b事务不能改,可以新增。因为无法避免幻读,说明可以新增产生幻读。
③ Read committed (读已提交):可避免脏读的发生。a事务读的时候,b事务可以改可以新增。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
======================================================================
事务:mysql技术内幕
===事务的分类
扁平化事务:最一般最常用的事务,事务中的所有操作都是平
带保存点的扁平化事务
链接事务:只能回滚当前事务
嵌套事务:父事务提交子事务才能提交,父事务回滚子事务才能够回滚,加锁的时候存在父子共享锁。
分布式事务
===innodb的redo-log,事务是如何被持久化的呢?
事务提交的时候会被写到一个叫redo-log的日志缓冲文件中,并按照一定策略同步到磁盘,这就是事务持久化。
日志从:线程---重做日志文件缓冲---fsync写入磁盘
innodb_flush_log_at_trx_commit这个参数代表了刷新策略。
0---事务提交的时候不写入log,每秒直接从线程写到磁盘
1---事务提交commit写入log,并且从log写道磁盘
2---事务提交的时候写入到log,不进行fsync
===undo区域实现的功能,什么是MVCC
undo-log:实现事务回滚和mvcc
MVCC:多版本控制。使用undo区域实现非锁定一致性读,当某些数据被事务锁定的时候,其他事务可以进行非锁定一致性读操作,读取undo区域中的快照数据。
===某个事务回滚的时候当前数据页可能变化?将一个update操作进行回滚的时候数据库中具体是什么样的实现呢?
因为某个数据页上同时可能有数千个并发的事务在处理,所以不可能将该页面完全回滚到事务开始时候的样子,这样会影响其他的事务。
事务回滚其实本质上做相反的操作,比如说insert 10w条数据的时候,这个事务确实会分配表空间,这个是不可逆的。每个insert操作会有delete操作作用在上面,每个update会有相反的update作用。
===innodb默认使用的隔离级别?在这个隔离级别下innodb如何解决幻读的问题呢?innodb什么时候会使用到serializable的隔离级别呢?
默认使用repeatable read可重复读
使用next-key lock来解决幻读的问题
在分布式事务条件下会使用serializable事务级别。