34、mysql锁、事务、隔离

连接池   与用户请求建立连接

核心功能层         查询解析,分析,优化,内置函数,跨存储引擎的功能

存储引擎层         数据的存入和提取


mysql的发送默认为明文,可以使用ssl加密数据


parser 词法,语法,语意分析,优化

explain 分析工具

query cache 缓存,只保存select查询

并发访问控制:基于锁来实现


MySQL锁:

执行操作时施加的锁的模式

  读锁:用户在读的时候施加的锁,为防止别人修改,但是用户可以读,还被称为共享锁

  写锁:独占锁,排它锁。其他用户不能读,不能写


锁粒度:

  表锁:table lock

     锁定了整张表

  行锁:row lock

     锁定了需要的行


   粒度越小,开销越大,但并发性越好:

   粒度越大,开销越小,但并非性越差;


 锁的实现位置:

    MySQL锁 可以手动使用,可以使用显示锁

    存储引擎锁 自动进行的(隐式锁)


    显示锁:

        LOCK TABLES t1 READ; 施加读锁

        LOCK TABLES t1 WRITE; 施加写锁

        UNLOCK TABLES; 解锁

        SHOW OPEN TABLES WHERE In_use > 0; 查看那些表被锁定


    InnoDB存储引擎也支持另外一种显示锁(锁定挑选出的部分行,行级锁)

      select .... lock in share mode

      select .... for update

SHOW TABLE STATUS LIKE 't1'\G

SELECT * FROM t1 WHERE ID <=3 LOCK IN SHARE MODE;

做备份时要手动施加读锁


事务:Transaction

    事务就是一组原子性的查询语句,也即将多个查询当作一个独立的工作单元


    ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务

    A:Atomicity 原子性,都执行或者都不执行

    C:Consistency          一致性,从一个一致性状态转到另外一个一致性状态

    I:Isolaction 隔离性。一个事务的所有修改操作在提交前对其他事务时不可见的

    D: Durability 持久性,一旦事务得到提交,其所做的修改会永久有效

安全性越高,并发性越低

隔离级别:

   READ UNCOMMITTEND (读未提交),脏读,不可重复读,幻读

   READ COMMITTEND (读提交)

   REPEATABLE READ             (可重读)

   SERIALIZABLE (可串行化)强制事务的串行执行避免了幻读;性能极低


START TRANSACTION; 启动事务( MyISAM不支持事务)

COMMIT; 事务提交

ROLLBACK 事务回滚(全部回滚)

SAVEPOINT identifier         创建回滚点

ROLLBACK TO identifier                 事务回滚(回滚到某个点)



mysql事务默认自动提交,对手动显示启动事务不会影响。

如何没有显式启动事务,每个语句都会当作一个默认的事务,其执行完成会被自动提交

可通过如下方式关闭自动提交。

SHOW GLOBAL VARIABLES LIKE '%commit%';

select @@global.autocommit

set global autocommit = 0

注意 关闭自动提交,请记得手动启动事务,应记得手动提交


查看mysql的事务隔离级别

   show global  variables like '%iso%'

   select @@global.tx_isolation


建议:对事物要求不特别严格的场景下,可以使用读提交


MVCC:多版本并发控制

    每个事务启动时,InnoDB会为每个启动的事务提供一个当下时刻的快照

      为实现此功能,InnoDB会为每个表提供两隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间

        里面存储的系统版本号


MVCC只在两个隔离级别下有效:read committed和repeatable read


猜你喜欢

转载自blog.51cto.com/kaiyuandiantang/2315119