您的位置:首页 > 数据库 > MySQL

MySQL知识点整理

2016-06-16 21:45 417 查看

MySQL零碎知识点

在SQL标准中定义了四中隔离级别,每一种隔离级别都规定了一个失误中所做的修改,那些是在事物内和事物间课件的,通常低的隔离级别,可以支持更高的并发,系统的开销也更低。几种隔离级别如下:

READ UNCOMMITED(未提交读)


READ UNCOMMITED
级别,事务的修改即使尚未提交,也是对其他事物可见的。我们称之为脏读(dirty read),实际上这个事务并没有做任何处理互斥访问的工作。

READ COMMITED(提交读)


一个事务开始到结束之前其在事务中所做的一切修改,对外界来说都是不可见的。这个级别也称做不可重复读,因为两次执行同样的查询可能会得到不一样的结果

REPEATABLE READ(可重复读)


可重复读隔离界别解决了脏读的问题,该级别保证,在同一个事物中,读取同样的记录的结果是一致的(这就好像每个事物都保存一个副本一样,直到完成一个事物之后,才会提交合并,类似于git的commit)。但这个隔离级别还是无法解决另外一个问题:幻读

SERIALIZEABLE(可串行化)


该级别是最高的隔离级别,它通过强行串行化事物,避免了前面所说的幻读问题。

关于脏读,不可重复读,幻读

脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问 这个数据,然后使用了这个数据。

不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不 可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果 只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。

幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。 如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。

不可重复读的重点是修改,同一事务,两次读取到的数据不一样。幻读的重点在于新增或者删除 同样的条件 ,第 1 次和第 2 次读出来的记录数不一样。

事务日志

当开始一个事务的时候,会记录该事务的lsn(log sequence number)号; 当事务执行时,会往InnoDB存储引擎的日志。的日志缓存里面插入事务日志;当事务提交时,必须将存储引擎的日志缓冲写入磁盘(通过innodb_flush_log_at_trx_commit来控制),也就是写数据前,需要先写日志。这种方式称为“预写日志方式”,innodb通过此方式来保证事务的完整性。也就意味着磁盘上存储的数据页和内存缓冲池上面的页是不同步的,是先写入redo log,然后写入data file,因此是一种异步的方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql mysql 事务 并发