当前位置: 首页 > news >正文

双语网站建设定制开发荥阳网页设计

双语网站建设定制开发,荥阳网页设计,私人网站服务器,外管局网站做延期收汇报告mysql的锁机制 1、MySQL锁的基本介绍 ​ **锁是计算机协调多个进程或线程并发访问某一资源的机制。**在数据库中#xff0c;除传统的 计算资源#xff08;如CPU、RAM、I/O等#xff09;的争用以外#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一…mysql的锁机制 1、MySQL锁的基本介绍 ​ **锁是计算机协调多个进程或线程并发访问某一资源的机制。**在数据库中除传统的 计算资源如CPU、RAM、I/O等的争用以外数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说锁对数据库而言显得尤其重要也更加复杂。 ​ 相对其他数据库而言MySQL的锁机制比较简单其最 显著的特点是不同的存储引擎支持不同的锁机制。比如MyISAM和MEMORY存储引擎采用的是表级锁table-level lockingInnoDB存储引擎既支持行级锁row-level locking也支持表级锁但默认情况下是采用行级锁。 ​ **表级锁**开销小加锁快不会出现死锁锁定粒度大发生锁冲突的概率最高并发度最低。 ​ **行级锁**开销大加锁慢会出现死锁锁定粒度最小发生锁冲突的概率最低并发度也最高。 ​ 从上述特点可见很难笼统地说哪种锁更好只能就具体应用的特点来说哪种锁更合适仅从锁的角度 来说表级锁更适合于以查询为主只有少量按索引条件更新数据的应用如Web应用而行级锁则更适合于有大量按索引条件并发更新少量不同数据同时又有 并发查询的应用如一些在线事务处理OLTP系统。 2、MyISAM表锁 MySQL的表级锁有两种模式表共享读锁Table Read Lock和表独占写锁Table Write Lock。 对MyISAM表的读操作不会阻塞其他用户对同一表的读请求但会阻塞对同一表的写请求对 MyISAM表的写操作则会阻塞其他用户对同一表的读和写操作MyISAM表的读操作与写操作之间以及写操作之间是串行的 建表语句 CREATE TABLE mylock (id int(11) NOT NULL AUTO_INCREMENT,NAME varchar(20) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEMyISAM DEFAULT CHARSETutf8;INSERT INTO mylock (id, NAME) VALUES (1, a); INSERT INTO mylock (id, NAME) VALUES (2, b); INSERT INTO mylock (id, NAME) VALUES (3, c); INSERT INTO mylock (id, NAME) VALUES (4, d);MyISAM写锁阻塞读的案例 ​ 当一个线程获得对一个表的写锁之后只有持有锁的线程可以对表进行更新操作。其他线程的读写操作都会等待直到锁释放为止。 session1session2获取表的write锁定lock table mylock write;当前session对表的查询插入更新操作都可以执行select * from mylock;insert into mylock values(5,‘e’);当前session对表的查询会被阻塞select * from mylock释放锁unlock tables当前session能够立刻执行并返回对应结果 MyISAM读阻塞写的案例 ​ 一个session使用lock table给表加读锁这个session可以锁定表中的记录但更新和访问其他表都会提示错误同时另一个session可以查询表中的记录但更新就会出现锁等待。 session1session2获得表的read锁定lock table mylock read;当前session可以查询该表记录select * from mylock;当前session可以查询该表记录select * from mylock;当前session不能查询没有锁定的表select * from personTable ‘person’ was not locked with LOCK TABLES当前session可以查询或者更新未锁定的表select * from mylockinsert into person values(1,‘zhangsan’);当前session插入或者更新表会提示错误insert into mylock values(6,‘f’)Table ‘mylock’ was locked with a READ lock and can’t be updatedupdate mylock set name‘aa’ where id 1;Table ‘mylock’ was locked with a READ lock and can’t be updated当前session插入数据会等待获得锁insert into mylock values(6,‘f’);释放锁unlock tables;获得锁更新成功 注意: MyISAM在执行查询语句之前会自动给涉及的所有表加读锁在执行更新操作前会自动给涉及的表加写锁这个过程并不需要用户干预因此用户一般不需要使用命令来显式加锁上例中的加锁时为了演示效果。 MyISAM的并发插入问题 MyISAM表的读和写是串行的这是就总体而言的在一定条件下MyISAM也支持查询和插入操作的并发执行 session1session2获取表的read local锁定lock table mylock read local当前session不能对表进行更新或者插入操作insert into mylock values(6,‘f’)Table ‘mylock’ was locked with a READ lock and can’t be updatedupdate mylock set name‘aa’ where id 1;Table ‘mylock’ was locked with a READ lock and can’t be updated其他session可以查询该表的记录select* from mylock当前session不能查询没有锁定的表select * from personTable ‘person’ was not locked with LOCK TABLES其他session可以进行插入操作但是更新会阻塞update mylock set name ‘aa’ where id 1;当前session不能访问其他session插入的记录释放锁资源unlock tables当前session获取锁更新操作完成当前session可以查看其他session插入的记录 可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺 mysql show status like table%; ------------------------------ | Variable_name | Value | ------------------------------ | Table_locks_immediate | 352 | | Table_locks_waited | 2 | ------------------------------ --如果Table_locks_waited的值比较高则说明存在着较严重的表级锁争用情况。InnoDB锁 1、事务及其ACID属性 事务是由一组SQL语句组成的逻辑处理单元事务具有4属性通常称为事务的ACID属性。 原子性Actomicity事务是一个原子操作单元其对数据的修改要么全都执行要么全都不执行。 一致性Consistent在事务开始和完成时数据都必须保持一致状态。 隔离性Isolation数据库系统提供一定的隔离机制保证事务在不受外部并发操作影响的“独立”环境执行。 持久性Durable事务完成之后它对于数据的修改是永久性的即使出现系统故障也能够保持。 2、并发事务带来的问题 相对于串行处理来说并发事务处理能大大增加数据库资源的利用率提高数据库系统的事务吞吐量从而可以支持更多用户的并发操作但与此同时会带来一下问题 脏读 一个事务正在对一条记录做修改在这个事务并提交前这条记录的数据就处于不一致状态这时另一个事务也来读取同一条记录如果不加控制第二个事务读取了这些“脏”的数据并据此做进一步的处理就会产生未提交的数据依赖关系。这种现象被形象地叫做“脏读” 不可重复读一个事务在读取某些数据已经发生了改变、或某些记录已经被删除了这种现象叫做“不可重复读”。 幻读 一个事务按相同的查询条件重新读取以前检索过的数据却发现其他事务插入了满足其查询条件的新数据这种现象就称为“幻读” 上述出现的问题都是数据库读一致性的问题可以通过事务的隔离机制来进行保证。 数据库的事务隔离越严格并发副作用就越小但付出的代价也就越大因为事务隔离本质上就是使事务在一定程度上串行化需要根据具体的业务需求来决定使用哪种隔离级别 脏读不可重复读幻读read uncommitted√√√read committed√√repeatable read√serializable 可以通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况 mysql show status like innodb_row_lock%; -------------------------------------- | Variable_name | Value | -------------------------------------- | Innodb_row_lock_current_waits | 0 | | Innodb_row_lock_time | 18702 | | Innodb_row_lock_time_avg | 18702 | | Innodb_row_lock_time_max | 18702 | | Innodb_row_lock_waits | 1 | -------------------------------------- --如果发现锁争用比较严重如InnoDB_row_lock_waits和InnoDB_row_lock_time_avg的值比较高3、InnoDB的行锁模式及加锁方法 ​ 共享锁s又称读锁。允许一个事务去读一行阻止其他事务获得相同数据集的排他锁。若事务T对数据对象A加上S锁则事务T可以读A但不能修改A其他事务只能再对A加S锁而不能加X锁直到T释放A上的S锁。这保证了其他事务可以读A但在T释放A上的S锁之前不能对A做任何修改。 ​ 排他锁x又称写锁。允许获取排他锁的事务更新数据阻止其他事务取得相同的数据集共享读锁和排他写锁。若事务T对数据对象A加上X锁事务T可以读A也可以修改A其他事务不能再对A加任何锁直到T释放A上的锁。 ​ mysql InnoDB引擎默认的修改数据语句update,delete,insert都会自动给涉及到的数据加上排他锁select语句默认不会加任何锁类型如果加排他锁可以使用select …for update语句加共享锁可以使用select … lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的也不能通过for update和lock in share mode锁的方式查询数据但可以直接通过select …from…查询数据因为普通查询没有任何锁机制。 InnoDB行锁实现方式 ​ InnoDB行锁是通过给索引上的索引项加锁来实现的这一点MySQL与Oracle不同后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着只有通过索引条件检索数据InnoDB才使用行级锁否则InnoDB将使用表锁 1、在不通过索引条件查询的时候innodb使用的是表锁而不是行锁 create table tab_no_index(id int,name varchar(10)) engineinnodb; insert into tab_no_index values(1,1),(2,2),(3,3),(4,4);session1session2set autocommit0select * from tab_no_index where id 1;set autocommit0select * from tab_no_index where id 2select * from tab_no_index where id 1 for updateselect * from tab_no_index where id 2 for update; session1只给一行加了排他锁但是session2在请求其他行的排他锁的时候会出现锁等待。原因是在没有索引的情况下innodb只能使用表锁。 2、创建带索引的表进行条件查询innodb使用的是行锁 create table tab_with_index(id int,name varchar(10)) engineinnodb; alter table tab_with_index add index id(id); insert into tab_with_index values(1,1),(2,2),(3,3),(4,4);session1session2set autocommit0select * from tab_with_indexwhere id 1;set autocommit0select * from tab_with_indexwhere id 2select * from tab_with_indexwhere id 1 for updateselect * from tab_with_indexwhere id 2 for update; 3、由于mysql的行锁是针对索引加的锁不是针对记录加的锁所以虽然是访问不同行的记录但是依然无法访问到具体的数据 insert into tab_with_index values(1,4);session1session2set autocommit0set autocommit0select * from tab_with_index where id 1 and name‘1’ for updateselect * from tab_with_index where id 1 and name‘4’ for update虽然session2访问的是和session1不同的记录但是因为使用了相同的索引所以需要等待锁 总结 对于MyISAM的表锁主要讨论了以下几点 1共享读锁S之间是兼容的但共享读锁S与排他写锁X之间以及排他写锁X之间是互斥的也就是说读和写是串行的。 2在一定条件下MyISAM允许查询和插入并发执行我们可以利用这一点来解决应用中对同一表查询和插入的锁争用问题。 3MyISAM默认的锁调度机制是写优先这并不一定适合所有应用用户可以通过设置LOW_PRIORITY_UPDATES参数或在INSERT、UPDATE、DELETE语句中指定LOW_PRIORITY选项来调节读写锁的争用。 4由于表锁的锁定粒度大读写之间又是串行的因此如果更新操作较多MyISAM表可能会出现严重的锁等待可以考虑采用InnoDB表来减少锁冲突。 对于InnoDB表本文主要讨论了以下几项内容 1InnoDB的行锁是基于索引实现的如果不通过索引访问数据InnoDB会使用表锁。 2在不同的隔离级别下InnoDB的锁机制和一致性读策略不同。 在了解InnoDB锁特性后用户可以通过设计和SQL调整等措施减少锁冲突和死锁包括 尽量使用较低的隔离级别 精心设计索引并尽量使用索引访问数据使加锁更精确从而减少锁冲突的机会选择合理的事务大小小事务发生锁冲突的几率也更小给记录集显式加锁时最好一次性请求足够级别的锁。比如要修改数据的话最好直接申请排他锁而不是先申请共享锁修改时再请求排他锁这样容易产生死锁不同的程序访问一组表时应尽量约定以相同的顺序访问各表对一个表而言尽可能以固定的顺序存取表中的行。这样可以大大减少死锁的机会尽量用相等条件访问数据这样可以避免间隙锁对并发插入的影响 不要申请超过实际需要的锁级别除非必须查询时不要显示加锁对于一些特定的事务可以使用表锁来提高处理速度或减少死锁的可能。
http://www.dnsts.com.cn/news/186669.html

相关文章:

  • 群晖可以做网站服务器wordpress主题汉化语言包
  • 网站开发报告辽宁省建设行业协会网站
  • 网站备案是一年一次吗中国工程项目网站
  • dedecms 营销网站模板电子销售网站模板
  • 街区网站建设肥城市区seo关键词排名
  • 免费试用网站怎么做中企动力苏州网页设计
  • 域名注册解析管理网站搜索引擎营销的典型案例
  • 2019年建设什么网站好wordpress添加keywords
  • 上海网络营销的企业网站建设优化推广哈尔滨
  • 网络公司除了建网站图片制作视频教程
  • 检察机关门户网站建设自查报告展厅设计说明万能模板
  • 哪个网站可以专门做产品推广安卓优化大师老版本下载
  • 网站怎么做关键词搜索排面温州网站制作推广
  • 定制网站建设公司哪家便宜电子商务网站建设需求概述
  • 与做机器人有关的网站html网页设计代码购物网站
  • 长沙网站托管哪家好桐乡网站二次开发
  • 阜宁网站开发管理咨询和战略咨询
  • 信阳网站建设哪个好久久建筑网官网登录入口
  • 广州旅游网站建设设计素材天下
  • 购物网站导航模板企业宣传网站方案
  • 好用的网站开发框架怎样在网上注册自己的公司
  • 南通工程建设信息网站佛山公司做网站
  • 在火炉做网站公园坐什么车中山市企业网站seo哪家好
  • 给网站做视频怎么赚钱脚上起小水泡还很痒是什么原因
  • 四川广汇建设有限公司网站国内seo公司哪家最好
  • 广州手机网站建设哪家好凡科网站建设是免费的吗
  • 温州市门户网站杭州哪家做网站比较好
  • 厦门网站建设格网络架构扁平化
  • 网站空间永久免费网站建设需求分析的实施
  • 选择邯郸网站制作wordpress会员推广系统