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

外贸阿里巴巴国际站榆林网站优化

外贸阿里巴巴国际站,榆林网站优化,门户网站建设的请示,网站服务器如何做热备价事务的 隔离性 由这章讲述的 锁 来实现。 1. 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在程序开发中会存在多线程同步的问题, 当多个线程并发访问某个数据的时候, 尤其是针对一些敏感数据(订单, 金额), 我们就需要保证这个数据在任何时刻最多只有一个线… 事务的 隔离性 由这章讲述的 锁 来实现。 1. 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在程序开发中会存在多线程同步的问题, 当多个线程并发访问某个数据的时候, 尤其是针对一些敏感数据(订单, 金额), 我们就需要保证这个数据在任何时刻最多只有一个线程在访问, 保证数据的完整性和一致性. 在开发过程中加锁是为了保证数据的一致性 在数据库中, 除传统的计算资源的争用以外, 数据库也是一种供许多用户共享的资源. 为保证数据的一致性, 需要对并发操作进行控制, 因此产生了锁.  同时锁机制也为实现MySQL的各个隔离级别提供了保证. 锁冲突也是影响数据库并发访问性能的一个重要因素 2. MySQL并发事务访问相同记录 并发事务访问相同记录的情况大致可以划分为 3 种 2.1 读-读情况 读 - 读 情况即并发事务相继 读取相同的记录 。读取操作本身不会对记录有任何影响并不会引起什么问题所以允许这种情况的发生。 2.2 写-写情况 写 - 写 情况即并发事务相继对相同的记录做出改动。 在这种情况下会发生 脏写 的问题任何一种隔离级别都不允许这种问题的发生。所以在多个未提交事务相继对一条记录做改动时需要让它们 排队执行 这个排队的过程其实是通过 锁 来实现的。这个所谓的锁其实是一个 内存中的结构 在事务执行前本来是没有锁的也就是说一开始是没有 锁结构 和记录进行关联的如图所示 当一个事务想对这条记录做改动时首先会看看内存中有没有与这条记录关联的 锁结构 当没有的时候 就会在内存中生成一个 锁结构 与之关联。比如事务 T1 要对这条记录做改动就需要生成一个 锁结构 与之关联                      当事务T1改动了这条记录后就生成了一个锁结构与该记录关联因为之前没有别的事务为这条记录加锁所以is_waiting属性就是false我们把这个场景就称之为获取锁成功或者加锁成功然后就可以继续执行操作了。 在事务T1提交之前另一个事务T2也想对该记录做改动那么先看看有没有锁结构与这条记录关联发现有一个锁结构与之关联后然后也生成了一个锁结构与这条记录关联不过锁结构的is_waiting属性值为true ,表示当前事务需要等待我们把这个场景就称之为获取锁失败或者加锁失败图示: 在事务T1提交之后就会把该事务生成的锁结构释放掉然后看看还有没有别的事务在等待获取锁发现了事务T2还在等待获取锁所以把事务T2对应的锁结构的is_waiting属性设置为false然后把该事务对应的线程唤醒让它继续执行此时事务T2就算获取到锁了。效果图就是这样:   2.3 读-写或写-读情况 读 - 写 或 写 - 读 即一个事务进行读取操作另一个进行改动操作。这种情况下可能发生 脏读 、 不可重复读 、 幻读 的问题。 各个数据库厂商对 SQL 标准 的支持都可能不一样。比如 MySQL 在 REPEATABLE READ 隔离级别上就已经解决了 幻读 问题 (MVCC)。 2.4 并发问题的解决方案 怎么解决 脏读 、 不可重复读 、 幻读 这些问题呢其实有两种可选的解决方案 方案一读操作利用多版本并发控制 MVCC 下章讲解写操作进行 加锁 。 所谓的 MVCC 就是生成一个 ReadView 通过ReadView找到符合条件的记录版本历史版本由undo日志构建)。查询语句只能 读 到在生成ReadView之前 已提交事务所做的更改 在生成ReadView之前未提交的事务或者之后才开启的事务所做的更改是看不到的。而 写操作 肯定针对的是 最新版本的记录 读记录的历史版本和改动记录的最新版本本身并不冲突也就是采用MVCC时 读-写 操作并不冲突。   普通的 SELECT 语句在 READ COMMITTED 和 REPEATABLE READ 隔离级别下会使用到 MVCC 读取记录。 在 READ COMMITTED 隔离级别下一个事务在执行过程中每次执行 SELECT 操作时都会生成一个ReadView ReadView 的存在本身就保证了 事务不可以读取到未提交的事务所做的更改 也就是避免了脏读现象 在 REPEATABLE READ 隔离级别下一个事务在执行过程中只有 第一次执行 SELECT 操作 才会生成一个ReadView 之后的 SELECT 操作都 复用 这个 ReadView 这样也就避免了不可重复读和幻读的问题。 方案二读、写操作都采用 加锁 的方式。 如果业务场景不允许读取记录的旧版本而是每次必须读取记录的最新版本。比如在银行存款的事务中你需要先把账户的余额读出来然后将其加上本次存款的数额最后再写到数据库中。 在将账户余额读取出来后就不想让别的事务再访问该余额直到本次存款事务执行完成其他事务才可以访问账户的余额.这样在读取记录的时候就需要对其进行加锁操作这样也就意味着读操作和写操作也像写-写操作那样排队执行。 脏读的产生是因为当前事务读取了另一个未提交事务写的一条记录如果另一个事务在写记录的时候就给这条记录加锁那么当前事务就无法继续读取该记录了所以也就不会有脏读问题的产生了。 不可重复读的产生是因为当前事务先读取一条记录另外一个事务对该记录做了改动之后并提交之后当前事务再次读取时会获得不同的值如果在当前事务读取记录时就给该记录加锁那么另一个事务就无法修改该记录,自然也不会发生不可重复读了。 幻读问题的产生是因为当前事务读取了一个范围的记录然后另外的事务向该范围内插入了新记录当前事务再次读取该范围的记录时发现了新插入的新记录。采用加锁的方式解决幻读问题就有一些麻烦因为当前事务在第一次读取记录时幻影记录并不存在所以读取的时候加锁就有点尴尬 因为你并不知道给谁加锁)。   小结对比发现         采用 MVCC 方式的话 读 - 写 操作彼此并不冲突 性能更高 。         采用 加锁 方式的话 读 - 写 操作彼此需要 排队执行 影响性能。 一般情况下我们当然愿意采用 MVCC 来解决 读 - 写 操作并发执行的问题但是业务在某些特殊情况下要求必须采用 加锁 的方式执行。下面就讲解下 MySQL 中不同类别的锁。 3. 锁的不同角度分类 锁的分类图如下 3.1 从数据操作的类型划分读锁、写锁 读锁 也称为 共享锁 、英文用 S 表示。针对同一份数据多个事务的读操作可以同时进行而不会 互相影响相互不阻塞的。 写锁 也称为 排他锁  、英文用 X 表示。当前写操作没有完成前它会阻断其他写锁和读锁。这样 就能确保在给定的时间里只有一个事务能执行写入并防止其他用户读取正在写入的同一资源。 需要注意的是对于 InnoDB 引擎来说读锁和写锁可以加在表上也可以加在行上。 举例行级读写锁)︰ 如果一个事务T1已经获得了某个行r的读锁那么此时另外的一个事务T2是可以去获得这个行r的读锁的因为读取操作并没有改变行r的数据;但是如果某个事务T3想获得行r的写锁则它必须等待事务T1、T2释放掉行r上的读锁才行。 总结:这里的兼容是指对同一张表或记录的锁的兼容性情况。       1. 锁定读 在采用加锁方式解决脏读、不可重复读、幻读这些问题时读取一条记录时需要获取该记录的S锁其实是不严谨的有时候需要在读取记录时就获取记录的X锁来禁止别的事务读写该记录为此MysQL提出了两种比较特殊的 SELECT语句格式:         1) 对读取记录加S锁 在普通的SELECT语句后边加LOCK IN SHARE MODE如果当前事务执行了该语句那么它会为读取到的记录加S锁这样允许别的事务继续获取这些记录的S锁(比方说别的事务也使用SELECT ... LOCK IN SHAREMODE语句来读取这些记录)但是不能获取这些记录的X锁(比如使用SELECT ... FOR UPDATE语句来读取这些记录或者直接修改这些记录)。如果别的事务想要获取这些记录的x锁那么它们会阻塞直到当前事务提交之后将这些记录上的S锁释放掉。 2) 对读取记录加X锁 在普通的SELECT语句后边加FOR UPDATE如果当前事务执行了该语句那么它会为读取到的记录加X锁,这样既不允许别的事务获取这些记录的S锁比方说别的事务使用SELECT ... LOCK IN SHARE MODE语句来读取这些记录)也不允许获取这些记录的X锁(比如使用SELECT ... FOR UPDATE语句来读取这些记录或者直接修改这些记录)。如果别的事务想要获取这些记录的s锁或者x锁那么它们会阻塞直到当前事务提交之后将这些记录上的X锁释放掉。 2. 写操作 平常所用到的写操作无非是DELETE、UPDATE、INSERT这三种: DELETE: 对一条记录做DELETE操作的过程其实是先在B树中定位到这条记录的位置然后获取这条记录的X锁再执行delete mark 操作。我们也可以把这个定位待删除记录在B树中位置的过程看成是一个获取X锁的锁定读。 UPDATE︰在对一条记录做UPDATE操作时分为三种情况: 情况1∶未修改该记录的键值并且被更新的列占用的存储空间在修改前后未发生变化。 则先在B树中定位到这条记录的位置然后再获取一下记录的X锁最后在原记录的位置进行修改操作。我们也可以把这个定位待修改记录在B树中位置的过程看成是一个获取X锁的锁定读。 情况2:未修改该记录的键值并且至少有一个被更新的列占用的存储空间在修改前后发生变化。 则先在B树中定位到这条记录的位置然后获取一下记录的X锁将该记录彻底删除掉就是把记录彻底移入垃圾链表)最后再插入一条新记录。这个定位待修改记录在B树中位置的过程看成是一个获取X锁的锁定读新插入的记录由INSERT 操作提供的隐式锁进行保护。 情况3∶修改了该记录的键值 则相当于在原记录上做DELETE操作之后再来一次INSERT操作加锁操作就需要按照 DELETE和INSERT的规则进行了。 INSERT: 一般情况下新插入一条记录的操作并不加锁(加锁也找不到对象)通过一种称之为隐式锁的结构来保护这条新插入的记录在本事务提交前不被别的事务访问。
http://www.hkea.cn/news/14469310/

相关文章:

  • 网站素材库免费做网站建设怎么赚钱
  • 漯河网站开发郑州网站建设口碑好
  • 律师事务所 网站备案建设网站如果赚钱
  • 给网站公司做网站上海搬家公司哪家口碑最好
  • 个人做商贸网站如何查询一个网站的空间服务商
  • 创建个人网站教程怎么创建自己的网站
  • 学校网站源码php桂林网站开发m0773
  • 搜索关键字搜索到网站简单的php购物网站源码
  • 自治区建设厅网站知名购物网站有哪些
  • 上海做网站比较好的公司有哪些宁波网站排名提升
  • 网站建设合同需要交印花税怎么给网站命名
  • php网站链接支付宝青之峰做网站
  • xcode 网站开发哪有学电脑培训班
  • 企业组织网站建设方案wordpress single_post_title
  • 微商手机网站模板企业域名是什么
  • 足球比方类网站开发重庆餐饮网站设计
  • wordpress装修套餐网站源码中山网站建设文化如何
  • 枣庄机关建设网站wordpress求助
  • 专业的河南网站建设公司网站的二次开发
  • 质感设计网站企业官方网站的建设
  • metro网站模板好网站建设公司地址
  • 建设银行网站首页是多少深圳的网站建设公司价格
  • 做网站如何与腾讯合作前端页面设计
  • 如何在一个空间做2个网站怎么做记步数的程序到网站
  • 哪家做网站的公司五金配件网站建设报价
  • 可以做公众号背景图的网站互联网公司排名2024
  • 金品诚企网站建设辽宁建设工程网
  • 网站备案个人备案公司网站答题网站开发教程
  • x网站免费模板免费下载wordpress判断ios或安卓
  • 如果在各大网站做免费的网络推广郑州直播app开发