网站首页 文章专栏 锁机制与数据库结构
锁机制与数据库结构
编辑时间:2020-08-03 12:57 作者:小铨 浏览量:82



锁机制

1. 事务回滚(不能自动回滚)
所以事务的回滚不是这么理解的,正确的理解应该是,如果事务中所有sql语句执行正确则需要自己手动提交commit;否则有任何一条执行错误,需要自己提交一条rollback,这时会回滚所有操作,而不是commit会给你自动判断和回滚。
2. innodb行锁与表锁的转变与注意
  InnoDB 行级锁是通过给索引上的索引项加锁来实现的,InnoDB行级锁只有通过索引条件检索数据,才使用行级锁;否则,InnoDB使用表锁
在不通过索引(主键)条件查询的时候,InnoDB是表锁而不是行锁。

对于锁与事务的建议

3.对于锁的建议

收集死锁信息:
  利用命令 SHOW ENGINE INNODB STATUS查看死锁原因。
  调试阶段开启 innodb_print_all_deadlocks,收集所有死锁日志。

减少死锁:
  使用事务,不使用 lock tables 。
  保证没有长事务。
  操作完之后立即提交事务,特别是在交互式命令行中。
  如果在用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),尝试降低隔离级别。
  修改多个表或者多个行的时候,将修改的顺序保持一致。
  创建索引,可以使创建的锁更少。
  最好不要用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE)。
  如果上述都无法解决问题,那么尝试使用 lock tables t1, t2, t3 锁多张表
4.对于事务的建议
innodb存储引擎由于实现了行几所,颗粒更小,实现更复杂。但是innodb行锁在并发性能上远远要高于表锁页锁。在使用方面可以尽量做到以下几点;

控制事务大小,减少锁定的资源量和锁定时间长度。
人所有的数据检索都通过索引来完成,从而避免因为无法通过索引加锁而升级为表锁。
减少基于范围的数据检索过滤条件,避免因为间隙锁带来的负面影响而锁定了不该锁定的数据。
在业务条件允许下,尽量使用较低隔离级别的事务隔离。减少隔离级别带来的附加成本。
河里使用索引,让innodb在索引上面加锁的时候更加准确。
在应用中尽可能做到访问的顺序执行
如果容易死锁,就可以考虑使用表锁来减少死锁的概率

MySQL基础结构

image.png

简单版的结构:


MySQL = 客户端 + 服务端
    客户端 = Connection(语言连接器例如:PHP-pdo,MySQLi)
    服务端 = SQL层 + 存储引擎层
        SQL层 = 链接/线程处理 + 查询缓存 + 分析器 + 优化器
        存储引擎 = InnoDB + MariaDB + .....

Connection:这一块其实主要是其他语言的连接,并不属于MySQL本身;主要是其他语言对于MySQL的连接操作的工具比如PHP中的:pdo,mysqli或者Navicat for MySQL

SQL层:功能主要包括权限判断,SQL解析功能和查询缓存处理等。

  1. 链接/线程处理:客户端通过 连接/线程层 来连接MySQL数据库,连接/线程层主要用来处理客户端的请求、身份验证和数据库安全性验证等。

  2. 查询缓存和查询分析器是SQL层的核心部分,其中主要涉及查询的解析、优化、缓存、以及所有内置的函数,存储过程,触发器,视图等功能。

  3. 优化器主要负责存储和获取所有存储在MySQL中的数据。



    出自:铨程互动

    地址:www.wuhequan.cn

    转载请注明出处!


来说两句吧
最新评论
0.077440s