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

诸暨市住房建设局网站深圳搜索引擎优化

诸暨市住房建设局网站,深圳搜索引擎优化,成都建设网站的公司,上海沪琛品牌营销策划有限公司#x1f307;个人主页#xff1a;平凡的小苏 #x1f4da;学习格言#xff1a;命运给你一个低的起点#xff0c;是想看你精彩的翻盘#xff0c;而不是让你自甘堕落#xff0c;脚下的路虽然难走#xff0c;但我还能走#xff0c;比起向阳而生#xff0c;我更想尝试逆风… 个人主页平凡的小苏 学习格言命运给你一个低的起点是想看你精彩的翻盘而不是让你自甘堕落脚下的路虽然难走但我还能走比起向阳而生我更想尝试逆风翻盘。 Mysql专栏Mysql内功修炼基地 家人们更新不易你们的点赞和⭐关注⭐真的对我真重要各位路 过的友友麻烦多多点赞关注。 欢迎你们的私信提问感谢你们的转发 关注我关注我关注我你们将会看到更多的优质内容 一、三种数据库并发的场景 读-读 不存在任何问题也不需要并发控制 读-写 有线程安全问题可能会造成事务隔离性问题可能遇到脏读幻读不可重复读 写-写 有线程安全问题可能会存在更新丢失问题比如第一类更新丢失第二类更新丢失(后面补充) 二、读写并发 多版本并发控制 MVCC 是一种用来解决 读-写冲突 的无锁并发控制为事务分配单向增长的事务ID为每个修改保存一个版本版本与事务ID关联读操作只读该事务开始前的数据库的快照。 所以 MVCC 可以为数据库解决以下问题 在并发读写数据库时可以做到在读操作时不用阻塞写操作写操作也不用阻塞读操作提高了数据库并发读写的性能 同时还可以解决脏读幻读不可重复读等事务隔离问题但不能解决更新丢失问题 2.1、三个前置知识 每个事务都有自己的事务id可以根据事务id的大小来决定事务到来的先后顺序 mysqld可能会面临处理多个事务的情况事务也有自己的生命周期mysqld要对多个事务进行管理先描述在组织。事务在我看来mysqld中一定是对应的一个或者一套结构体对象事务也有自己的结构体 3个记录隐藏列字段 DB_TRX_ID 6 byte最近修改( 修改/插入 )事务ID记录创建这条记录/最后一次修改该记录的事务ID DB_ROLL_PTR : 7 byte回滚指针指向这条记录的上一个版本简单理解成指向历史版本就行这些数据一般在 undo log 中 DB_ROW_ID : 6 byte隐含的自增ID隐藏主键如果数据表没有主键 InnoDB 会自动以DB_ROW_ID 产生一个聚簇索引 补充实际还有一个删除flag隐藏字段, 既记录被更新或删除并不代表真的删除而是删除flag变了 例如插入第一条数据的表结构 nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID张三20nullnull1 我们目前并不知道创建该记录的事务ID隐式主键我们就默认设置成null1。第一条记录也没有其他版本我们设置回滚指针为null。 undo日志 我们这里理解undo log简单理解成就是 MySQL 中的一段内存缓冲区用来保存日志数据的就行。 模拟MVCC 现在有一个事务10对student表中记录进行修改(update)将name(张三)改成name(李四)。 事务10,因为要修改所以要先给该记录加行锁。 修改前现将改行记录拷贝到undo log中所以undo log中就有了一行副本数据。(原理就是写时拷贝) 所以现在 MySQL 中有两行同样的记录。现在修改原始记录中的name改成 ‘李四’。并且修改原始记录的隐藏字段 DB_TRX_ID 为当前 事务10 的ID, 我们默认从 10 开始之后递增。而原始记录的回滚指针 DB_ROLL_PTR 列里面写入undo log中副本数据的地址从而指向副本记录既表示我的上一个版本就是它。 事务10提交释放锁。 备注此时最新的记录是’李四‘那条记录。 现在又有一个事务11对student表中记录进行修改(update)将age(20)改成age(50)。 事务11,因为也要修改所以要先给该记录加行锁。该记录是那条 修改前现将改行记录拷贝到undo log中所以undo log中就又有了一行副本数据。此时新的 副本我们采用头插方式插入undo log。 现在修改原始记录中的age改成 50。并且修改原始记录的隐藏字段 DB_TRX_ID 为当前 事务11 的ID。而原始记录的回滚指针 DB_ROLL_PTR 列里面写入undo log中副本数据的地址从而指向副本记录既表示我的上一个版本就是它。 事务11提交释放锁。 这样我们就有了一个基于链表记录的历史版本链。所谓的回滚无非就是用历史数据覆盖当前数据。 上面的一个一个版本我们可以称之为一个一个的快照。 delete场景 如果是delete呢一样的别忘了删数据不是清空而是设置flag为删除即可。也可以形成版本。 insert场景 因为insert是插入也就是之前没有数据那么insert也就没有历史版本。但是一般为了回滚操作insert的数据也是要被放入undo log中 如果当前事务commit了那么这个undolog 的历史insert记录就可以被清空了。 select场景 select读取是读取最新的版本呢还是读取历史版本 当前读读取最新的记录就是当前读。增删改都叫做当前读select也有可能当前读比如selectlock in share mode(共享锁), select for update 快照读读取历史版本(一般而言)就叫做快照读。 我们可以看到在多个事务同时删改查的时候都是当前读是要加锁的。那同时有select过来如果也要读取最新版(当前读)那么也就需要加锁这就是串行化。 但如果是快照读读取历史版本的话是不受加锁限制的。也就是可以并行执行换言之提高了效率即MVCC的意义所在。 结论:select是当前读还是快照读是由隔离级别决定的。 那么如何保证不同的事务看到不同的内容呢也就是如何如何实现隔离级别 MVCC机制Read View Read View就是事务进行 快照读 操作的时候生产的 读视图 (Read View)在该事务执行的快照读的那一刻会生成数据库系统当前的一个快照记录并维护系统当前活跃事务的ID(当每个事务开启时都会被分配一个ID, 这个ID是递增的所以最新的事务ID值越大) Read View 在MySQL 源码中,就是一个类本质是用来进行可见性判断的。 即当我们某个事务执行快照读的时候对该记录创建一个 Read View 读视图把它比作条件,用来判断当前事务能够看到哪个版本的数据既可能是当前最新的数据也有可能是该行记录的 undo log 里面的某个版本的数据。 下面是 ReadView 结构 class ReadView { // 省略... private: /** 高水位大于等于这个ID的事务均不可见*/ trx_id_t m_low_limit_id /** 低水位小于这个ID的事务均可见 */ trx_id_t m_up_limit_id; /** 创建该 Read View 的事务ID*/ trx_id_t m_creator_trx_id; /** 创建视图时的活跃事务id列表*/ ids_t m_ids; /** 配合purge标识该视图不需要小于m_low_limit_no的UNDO LOG * 如果其他视图也不需要则可以删除小于m_low_limit_no的UNDO LOG*/ trx_id_t m_low_limit_no; /** 标记视图是否被关闭*/ bool m_closed; // 省略... };m_ids; //一张列表用来维护Read View生成时刻系统正活跃的事务ID up_limit_id; //记录m_ids列表中事务ID最小的ID(没有写错) low_limit_id; //ReadView生成时刻系统尚未分配的下一个事务ID也就是目前已出现过的事务ID的 //最大值1(也没有写错) creator_trx_id //创建该ReadView的事务ID注意read view是事务可见性的一个类不是事务创建出来就会有read view而是当这个事务已经存在首次进行快照读的时候mysql 形成read view Read View实验 假设当前有条记录 nameageDB_TRX_IDDB_ROW_IDDB_ROLL_PTR王五23null1null 事务操作 事务4修改name(王五) 变成name(李六) 当 事务2 对某行数据执行了 快照读 数据库为该行数据生成一个 Read View 读视图 //事务2的 Read View m_ids; // 1,3 up_limit_id; // 1 low_limit_id; // 4 1 5原因ReadView生成时刻系统尚未分配的下一个事务ID creator_trx_id // 2 快照读id只有事务4修改过该行记录并在事务2执行快照读前就提交了事务 我们的事务2在快照读该行记录的时候就会拿该行记录的 DB_TRX_ID 去跟up_limit_id,low_limit_id和活跃事务ID列表(trx_list) 进行比较判断当前事务2能看到该记录的版本。 //事务2的 Read View m_ids; // 1,3 up_limit_id; // 1 low_limit_id; // 4 1 5原因ReadView生成时刻系统尚未分配的下一个事务ID creator_trx_id // 2 //事务4提交的记录对应的事务ID DB_TRX_ID4 //比较步骤 DB_TRX_ID4 up_limit_id1 ? 不小于下一步 DB_TRX_ID4 low_limit_id(5) ? 不大于下一步 m_ids.contains(DB_TRX_ID) ? 不包含说明事务4不在当前的活跃事务中。结论: 故事务4的更改应该看到。所以事务2能读到的最新数据记录是事务4所提交的版本而事务4提交的版本也是全局角度上最新的版本 RR与RC的本质区别 正是Read View生成时机的不同从而造成RC,RR级别下快照读的结果的不同 在RR级别下的某个事务的对某条记录的第一次快照读会创建一个快照及Read View, 将当前系统活跃的其他事务记录起来 此后在调用快照读的时候还是使用的是同一个Read View所以只要当前事务在其他事务提交更 新之前使用过快照读那么之后的快照读使用的都是同一个Read View所以对之后的修改不可见 即RR级别下快照读生成Read View时Read View会记录此时所有其他活动事务的快照这些事务的修改对于当前事务都是不可见的。而早于Read View创建的事务所做的修改均是可见 而在RC级别下的事务中每次快照读都会新生成一个快照和Read View, 这就是我们在RC级别下 的事务中可以看到别的事务提交的更新的原因 总之在RC隔离级别下是每个快照读都会生成并获取最新的Read View而在RR隔离级别下则是 同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。正是RC每次快照读都会形成Read View所以RC才会有不可重复读问题。 测试当前读和快照读在RR级别下的区别 -- 设置RR模式下测试 mysql set global transaction isolation level REPEATABLE READ; Query OK, 0 rows affected (0.00 sec) -- 重启终端 mysql select tx_isolation; ----------------- | tx_isolation | ----------------- | REPEATABLE-READ | ----------------- 1 row in set, 1 warning (0.00 sec) -- 依旧用之前的表 create table if not exists account( id int primary key, name varchar(50) not null default , blance decimal(10,2) not null default 0.0 )ENGINEInnoDB DEFAULT CHARSETUTF8; -- 插入一条记录用来测试 mysql insert into user (id, age, name) values (1, 15,黄蓉); Query OK, 1 row affected (0.00 sec)用例一 用例二 用例1与用例2唯一区别仅仅是 表1 的事务B在事务A修改age前 快照读 过一次age数据 而 表2 的事务B在事务A修改age前没有进行过快照读。 结论 事务中快照读的结果是非常依赖该事务首次出现快照读的地方 即某个事务中首次出现快照读决定该事务后续快照读结果的能力 delete同样如此
http://www.dnsts.com.cn/news/139144.html

相关文章:

  • 网站后缀comwordpress 字符串函数
  • 有网站前端如何做后台广告推广怎么找客户
  • 免费的舆情网站入口有哪些做网站 郑州公司哪家好
  • 外包公司做的网站怎么改密码怎么自己做公司网站
  • 使用微信做网站第三方登录深圳seo优化公司哪家好
  • 自己主机做多个网站沈阳做公司网站的公司
  • seo营销型网站做网页的代码
  • 济南网站建站公司电子商务网站建设 教材
  • 医院建设网站的作用排名seo怎么样
  • 海口模板建站平台济南网站建设行知科技不错
  • 继续网站建设wordpress中文安装
  • 网站开发报价中国建设银行网站外汇
  • 营销案例网站宝安营销型网站费用
  • seo怎么去优化网站织梦模板首页修改
  • 做安装系统网站有钱赚吗hfs网络文件服务器可以做网站
  • 网站做制作网页时科学规划网页的做法是
  • 贵阳建设网站开封网站建设报价
  • 深圳市seo网站设计多少钱淘宝券商城网站制作
  • 途牛网站建设的基本特点电子商务网站建设含代码
  • 网站开发建设价格附件在哪个平台做推广比较好
  • 淄博免费网站建设生产企业网站欣赏
  • 小学门户网站建设网上购物网站建设规划论文
  • 安庆网站建设推广关键词指数
  • 做网站要多少像素网站图片居中代码
  • 网站模板怎么建设厦门模板建站哪家好
  • 中国银行官网登录入口成都优化网站建设
  • 金华网站建设哪个公司好点小红书官方推广
  • 学校建设外文网站情况成都小程序开发价格
  • 大气企业网站源码公司网站制作方案
  • 企业网站 asp.netapp定制开发运营推广方案