高新能mysql 第一章 Mysql的架构与历史

1.读写锁:

    读锁是共享的,多个线程可以同时读取同一个资源;写锁是排他的,写锁可以阻塞其他的读锁和写锁。

2.锁粒度(即行锁和表锁级别):

    表锁: 当一个线程正在对一张表进行(插入、删除、更新等)前,需要先获得写锁,这会阻塞其他线程对这张表的读写操作。

    行级锁: 当一个线程在对一张表的某条数据进行(插入、删除、更新等)前,需要先获得表锁写锁,和行锁写锁,这会阻塞其他线程对这行数据的读写操作。

3.事务(即一组原子性的sql语句):

    3.1 ACID即(atomicity,consistency,isolation,durability):

        原子性: 整个事务要不全部提交,要不全部回滚。

        一致性: 事务只有commit和rollback两种情况。

        隔离性: 一个事务所做的修改在最终提交以前,对其他事务是不可见的。

        持久性: 一旦事务提交,则其所做的修改就会永远的保存在数据库中。

    3.2 隔离级别

        READ UNCOMMITTED(未提交读): 其他事务可以读到当前事务没提交的写操作。这也称为脏读(Dirty Read)。

        READ COMMITTED(提交读): 其他事务不可以读到当前事务未提交的写操作。可能会出现一种情况,在一个事务中的两次相同的查询语句得到的结果集不同。提交读也称为不可重复读。

        REPEATABLE READ(可重复读): 可重复读解决了脏读问题。该级别保证了在同一个事务中多次读取同样记录的结果是一致的。当时还是存在幻读现象(当事务读取一个范围内的记录时,另一个事务在这个范围插入一批新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)的现象)

        SERIALIZABLE(可串行化): 它通过强制事务串行执行,避免了前面说的幻读的问题。

    3.3 死锁

        InnoDB目前处理死锁的方法是,将持有最少行级排他锁的事务进行回滚

    3.4 事务日志

        事务日志可以提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改器内存拷贝,再把该修改行为记录到之在硬盘上的事务日志中,而不用每次都讲修改的数据本身持久到硬盘。

    3.5 Mysql中的事务

        自动提交(AUTOCOMMIT): 如果不是显式地开始一个事务,则每个查询都被当做一个事务执行提交操作。

        修改事务的隔离级别: SET [SESSION] TRANSACTION ISOLATION LEVEL READ COMMITTED;

        MyISAM为非事务性存储引擎

    3.6 隐式和显式锁定

        InnoDB采用的是两阶段锁定协议(two-phase locking protocol)。在事务执行过程中,随时都可以执行锁定,锁只有在执行COMMIT或者ROLLBACK的时候才会释放,并且所有的锁是在同一是个被释放。这里的锁定时瘾式锁定。

        显式锁定即 LOCK TABLES 语句。

4 多版本并发控制(MVCC)(只兼容READ COMMITTED ; REPEATABLE READ)

    MVCC的实现,是通过保存数据在某个时间点的快照来实现的。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到数据可能是不一样的。

    InnoDB的MVVC实现是在每行有两个隐藏属性(创建版本号和删除版本号)

 下面是REPEATABLE READ隔离级别下,MVCC具体是何如操作的:
    SELECT

       InnoDB会根据以下两个条件检查每行记录: 

             a. InnoDB只查找版本早于当前事务版本的数据行(也就是,行的版本号小于或等于事务的系统版本号),这样可以确保          事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过得。

             b. 行的删除版本要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行,在事务开始之前被删除。

   INSERT

         InnoDB为新插入的每一行保存当前系统版本号作为行版本号。

    DELETE

         InnoDB为删除的每一行保存当前系统版本号作为删除标志

    UPDATE

         InnoDB为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统保本号到原来的行作为行删除标识。

5 mysql的存储引擎

    5.1 SHOW TABLE STATUS LIKE 'user' \G

        高新能mysql 第一章 Mysql的架构与历史

        Row_format: 行的格式。对于MyISAM表,可选的值为Dynamic、Fixed或者Compressed。Dynamic的长度是可变的,一般包含可变长度的字段,如 VARCHAR 或者 BLOB。Fixed的行长度则是固定的,只包含固定长度的列,如CHAR和INTEGER。Compressed的行则只在压缩表中存在。

        Rows: 表中的行数。对于MyISAM和其他一些存储引擎,该值是精确的,但对于InnoDB,该值是估计值。

    5.2 InnoDB存储引擎

        InnoDB采用MVCC来支持高并发,并且实现了四个标准的隔离级别。其默认级别是REPEATABLE READ ,并且通过间隙(next-key locking)策略防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。

        InnoDB是基于聚簇索引。聚簇索引对主键查询有很高的性能。不过他的二级索引中必须包含主键列,所以以主键列很大的话,其他索引都会很大。

    5.3 MyISAM存储引擎

       MyISAM提供大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务和行级锁,

    5.4 修改存储引擎 ALTER TABLE mytable ENGINE = InnoDB;

       如果把一张InnoDB转化MyISAM在转会InnoDB会丢失外键。

    
    

;