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

用dw设计网站怎么做安徽省建设工程信息网官网首页

用dw设计网站怎么做,安徽省建设工程信息网官网首页,网站规划与设计论文,住房和城乡建设部文化中心网站什么是事务事务#xff08;Transaction)是由一系列对数据库中的数据进行访问与更新的操作所组成的一个程序执行单元。在同一个事务中所进行的操作#xff0c;要么都成功#xff0c;要么就什么都不做。理想中的事务必须满足四大特性#xff0c;这就是大名鼎鼎的ACID。事务的…什么是事务事务Transaction)是由一系列对数据库中的数据进行访问与更新的操作所组成的一个程序执行单元。在同一个事务中所进行的操作要么都成功要么就什么都不做。理想中的事务必须满足四大特性这就是大名鼎鼎的ACID。事务的ACID特性并不是所有的事务都满足ACID特性比如对于Oracle和SQL Server数据库其默认隔离级别是Read COMMITTED就不满足I(隔离性)的要求对于MySQL的NDB Cluster引擎来说不满足D(持久性)的要求。A(Atomicity)-原子性原子性指的是数据库事务是不可分割的一部分只有一个事务中的所有操作都成功这个事务才算执行成功一旦有一个操作失败那么其他成功的操作也必须回滚。以转账1000元场景为例一个转账过程就是一个事务这个事务主要包括以下两步1、从A账户扣除1000元2、将B账户中增加1000元试想如果第一步成功了那么第二步失败了那就等于A的1000元钱直接消失了相信这是任何人都不能接受的事项所以数据库事务才需要保证原子性。C(Consistent)-一致性指的是在事务开始之前和事务结束之后数据库的完整性约束都没有被破坏事务执行的前后都是合法的数据状态。比如我们有一张表中有一个字段name建立了一个唯一约束那么当我们进行事务提交或者事务回滚之后这个name必须依然保证唯一。I(Isolation)-隔离性隔离性就是说每个事务之间的操作应该相互隔离互不干扰。比如说一个事务提交之前对另一个事务不可见。隔离是一个相对抽象而复杂的概念比如说事务之间的隔离性我们到底要隔离到哪种程度呢所以针对隔离SQL92标准定义了4种隔离级别这个放在后面事务的隔离级别中介绍。D(Durable)-持久性持久性这个概念就比较容易理解了就是说事务一旦提交成功了那么就应该是持久的即使是数据库重启服务器宕机等情况发生数据都不会丢失(当然这个不能包括因为地震等自然灾害导致的存储数据的硬盘损发生不可逆的损坏)。事务的管理可能很多人会说自己都感知不到MySQL的事务其实这是因为MySQL事务是默认开启了自动提交的因此如果要感知到事务我们需要关闭自动提交或者显示开启事务。事务的自动提交查看自动提交语句SHOW VARIABLES LIKE autocommit;-- ON表示开启了自动提交 SELECT autocommit;-- 1表示开启了自动提交执行如下语句关闭自动提交SET autocommitOFF; SET autocommit 0;不过需要注意的是这种修改方式只是在当前会话窗口生效对其他会话窗口是不生效的MySQL几乎所有变量设置都会分成两个级别session(会话)和global(全局)级别默认就是session级别。常用的事务控制语句START TRANSACTION或者BEGIN显示的开启事务。需要注意的是在存储过程中只能用START TRANSACTION开启事务因为存储过程本来有BEGIN…END语法两者会冲突。COMMIT提交事务。也可以写成COMMIT WORK。ROLLBACK回滚事务。也可以写成ROLLBACK WORK。SAVEPOINT identifier自定义保存点适用于长事务可以回滚到我们自定义的位置。RELEASE SAVEPOINT identifier删除一定保存点如果没有保存点的时候会报错ROLLBACK TO[SAVEPOINT] identifier回滚到指定保存点。COMMIT和COMMIT WORK的区别这两个都能提交一个事务区别就在于提交事务之后的操作同样的还有ROLLBACK和ROLLBACK WORK主要是通过一个变量来控制completion_type可以执行下面的sql来查看结果SHOW VARIABLES LIKE %completion_type%;completion_type有如下三种结果举个栗子1SET completion_type1; --1 begin;--2 INSERT test2 VALUES(1,张1);--3 commit work;--4 INSERT test2 VALUES(2,张1);--5 select * from test2;--6 rollback;--7 select * from test2;--8第4条语句中我们提交了一个事务第5条语句中我们又插入了一条数据此时第六条语句可以查询出2条数据接下来我们回滚语句8再去查询就会发现只剩一条数据了因为语句6倍回滚了我们在语句4之后并没有显示的开启一个事务这就说明语句4自动开启了一个新的事务。举个栗子2SET completion_type2; begin; INSERT test2 VALUES(3,张1); commit work; select * from test2;最后一条语句返回如下结果先提示的断开连接然后自动重连。测试这个例子的时候用工具比如sqlyog可能会不是很明显因为工具会自动帮忙重连看起来就好像没断开一样建议用命令窗口的形式测试事务的分类从事务的理论角度来说我们可以把事务分为以下五大类扁平事务这种是最简单也是最常用的一种事务这种事务中的所有操作都是原子的要么全部成功要么什么都不做。带有保存点的扁平事务这种一般比较适合于长事务事务处理到后面报错的时候我们可以选择不全部回滚事务而是回滚到我们自定义好的某一个保存点。如下例子BEGIN; INSERT test VALUES(1,张1); SAVEPOINT A INSERT test VALUES(2,张2); ROLLBACK TO A COMMIT;上面示例语句中我么你定义了一个保存点A然后在后面又回滚到A这时候提交事务那么第二条插入语句是失败的而第一条语句是成功的。注意回滚到指定保存点之后事务仍然还在活动状态我们依然需要执行COMMIT或者ROLLBACK语句才算结束了事务链事务在提交一个事务之后释放掉我们不需要的数据将必要的数据隐式的传给下一个事务。注意提交事务操作和开始下一个事务操作是一个原子操作这就意味着下一个事务能看到上一个事务的结果。链事务可以看成带有保存点的特殊事务他们的区别就是带有保存点的事务可以回滚到任意保存点但是回滚之后事务仍然活跃需要执行COMMIT或者ROLLBACK之后才结束事务而链事务中只能回滚到最近的一个保存点(即开始事务的点)。链事务可以通过上面的completion_type参数来实现。上文中有举例使用方法这里就不重复举例了。嵌套事务嵌套事务就是说一个事务之中嵌套另一个事务事务之间存在父子关系子事务的提交之后并不生效需要等到父事务提交之后才会生效。需要注意的是MySQL原生并不支持嵌套事务但是可以通过保存点模拟嵌套事务只是说这么模拟的话就没有真正的嵌套事务这么灵活。分布式事务分布式事务通常就是在分布式环境下多个数据库下运行不同的扁平事务。多个数据库环境下运行的扁平事务就合成了一个分布式事务。事务的隔离级别Read Uncommitted(未提交读)简称RU。这种是最低的隔离级别等于没有隔离基本上没有数据库会使用这个级别。一个事务可以读取到其他事务未提交的数据这种也叫做脏读。什么是脏读请看下面这个例子左边是事务1先查一次查到id为1的数据name为张三这时候事务2又来了把张三改成了李四然后事务1又进行了一次查询查出来了name为李四那么假如这时候事务2发生了回滚也就是name还是张三但是事务1却读到了李四这就是脏读。Read Committed(已提交读)简称RC。一个事务只能读取到其他事务已提交的数据就是说在一个事务里面执行同样的查询会出现两次不一样的结果。Oracle和SQL Server数据库默认的数据库隔离级别。这种隔离级别解决了脏读问题但是会出现不可重复读的问题。什么是不可重复读还是看上面那个例子假设事务2更新之后马上就提交然后事务1第二次查询查出来的结果还是李四只是这次就不算是脏读了因为事务2提交了这种就叫不可重复读因为事务1中两次查询同一条数据结果不一样。Repeatable Read(可重复读)简称RR。这种隔离级别解决了不可重复读问题就是说在同一个事务中执行相同的查询结果都是一样的但是这种级别会出现幻读问题(InnoDB引擎例外InnoDB引擎通过间隙锁解决了幻读问题)。什么是幻读请看下面这个例子上面图形中事务1进行了一个范围查询第一次只能查出一条记录这时候事务2来插入了一条数据然后事务1再次执行同一个查询这时候就能查出来两条记录也就是多了一条给人一种幻觉所以称之为幻读。说到这里可能有人就有疑问了因为感觉不可重复读和幻读都是读取到已提交事务的结果好像没什么区别确实如此不可重复读和幻读本质上是一样的但是不可重复读针对的是更新和删除操作而幻读仅针对插入操作。Serializable(串行化)这种是隔离的最高级别也就是说所有的事务都是串行执行的也就不存在并发事务脏读可重复读和幻读问题自然也就没有了。不同隔离级别对比不同的隔离级别可以解决不同的问题大致如下图对于未提交读和已提交读大家可能都很好理解只要控制一个事务提交之后才能对另一个事务可见但是对于可重复读MySQL到底是如何实现即使一个事务已经提交了还能对另一个事务不可见呢这就是接下来我们要讲解的MVCC了。事务隔离的实现方案事务隔离的实现方案有两种LBCC和MVCCLBCCLBCC基于锁的并发控制英文全称Based Concurrency Control。这种方案比较简单粗暴就是一个事务去读取一条数据的时候就上锁不允许其他事务来操作(当然这个锁的实现也比较重要如果我们只锁定当前一条数据依然无法解决幻读问题)。当前读这个概念其实很好理解MySQL加锁之后就是当前读。假如当前事务只是加共享锁那么其他事务就不能有排他锁也就是不能修改数据而假如当前事务需要加排他锁那么其他事务就不能持有任何锁。总而言之能加锁成功就确保了除了当前事务之外其他事务不会对当前数据产生影响所以自然而然的当前事务读取到的数据就只能是最新的而不会是快照数据(后文MVCC会解释快照读概念)。LBCC方案中如果我们的业务系统是读多写少的话这种方案就会极大影响了效率所以我们就有了另一种解决方案MVCC。MVCCMVCC,多版本的并发控制英文全称Multi Version Concurrency Control。就是当我们在修改数据的时候可以为这条数据创建一个快照后面就可以直接读取这个快照。那么MVCC具体到底是如何实现的呢为了实现MVCC机制InnoDB内部为每一行添加了两个隐藏列DB_TRX_ID和DB_ROLL_PTRMySQL另外还有一个隐藏列DB_ROW_ID这是在InnoDB表没有主键的时候会用来作为主键想详细了解可以点击这里。DB_TRX_ID长度为6字节存储了插入或更新语句的最后一个事务的事务ID。DB_ROLL_PTR长度为7字节称之为回滚指针。回滚指针指向写入回滚段的undo log记录读取记录的时候会根据指针去读取undo log中的记录。正因为MySQL中undo log中会维护一个历史数据记录所以我们应该养成定期提交事务的习惯否则回滚段会越来越大甚至占满了表空间。快照读快照读是针对上文的当前读而言指的是在RR隔离级别下在不加锁的情况下MySQL会根据回滚指针选择从undo log记录中获取快照数据而不总是获取最新的数据这也就是为什么另一个事务提交了数据在当前事务中看到的依然是另一个事务提交之前的数据。MySQL什么时候开始读取快照我们先看看MySQL默认隔离级别RR下的一个例子注意test和test2两张表一开始都是空表均只有id和name两个字段。场景1(事务1操作数据之后再进行第一次查询)场景2(事务1不进行任何操作事务2先开始第一次查询)通过上面两个场景中我们可以得出结论RR隔离级别快照并不是在BEGIN就开始产生了而是要等到事务当中的第一次查询之后才会产生快照之后的查询就只读取这个快照数据场景3(事务2先进行一次t1表查询之后事务1再去操作其他表t2)从场景3我们可以得出结论RR隔离级别快照并不只是针对当前所查询的数据而是针对当前MySQL中的所有数据(跨库也一样只要在同一个MySQL)MVCC查询机制MVCC机制到底如何查询的呢假设由很多个事务同时进行那么就会产生很多快照查询的时候又到底是怎么做的呢接下来我们把抽象的概念具体化假定DB_TRX_ID和DB_ROLL_PTR均为整型接下来我们进行查询演示1、清空原先的test表事务A插入两条数据此时DB_TRX_ID(事务id)为1,DB_ROLL_PTR(回滚指针为null)2、这时候事务B进行了一次查询会得到上面的结果事务2还没提交的时候又来了事务C事务C插入了id3的数据此时表中的数据如下注意这时候第3条数据的事务id为3因为事务2也会产生一个事务id3、这时候事务B再次进行查询根据上面了解的我们知道这时候应该是查询不出王五的所以实际上二次查询可能是这么查的select * from test where 事务id2-- 因为当前的事务id为24、假如这时候事务D又来了把id1的数据给删除了这时候会把原数据的回滚指针记录为当前的事务id4所以此时数据如下5、回到事务B继续查询应该还是只有1和2两条数据那么他可能是这么查询的select * from test where 事务id2 and (回滚指针 is null or 回滚指针 2)6、假如这时候又来了事务E对第2条数据进行了更新这时候会生产一条事务id为5的数据并把原数据的回滚指针也同时标记为当前的事务id5那么会得到如下数据根据上面猜测执行下面的查询select * from test where 事务id2 and (回滚指针 is null or 回滚指针 2) 这时候发现查出来的数据还是只有1和2两条。MVCC查询两大规则综上MVCC大致查询规则如下1、只查询事务id小于等于当前事务id的数据。(这里要等于是因为假如自己的事务插入了一条数据会生成一条当前事务id的数据所以必须包含本事务自己插入的数据)2、只查询未删除(回滚指针为空)或者回滚指针大于当前事务id的数据。(这里不能等于是因为假如自己的事务删除了一条数据会生成数据的回滚指针为当前事务id所以必须排除掉自己删除的数据)当然上面规则只是简化了实际查询远比这里复杂只是希望借助这种简单化的概念可以帮助大家更好的理解MVCC工作机制。作者双子孤狼原文链接https://blog.csdn.net/zwx900102/article/details/106544843
http://www.zqtcl.cn/news/196289/

相关文章:

  • 怎么做网站排名优化免费jq网站模板
  • 源码时代培训机构官网自己建网站怎么做seo
  • 宜都网站制作济南比较大的网站制作公司
  • 怎么用电脑做网站主机假网站怎么制作
  • 网站 微信网络营销方案设计心得
  • 淘宝客 wordpress网站wordpress类似的工具
  • 农村建设房子建设网站建设渭南房产网站制作
  • php网站开发用什么win2008 iis 新建网站
  • 中山营销网站建设杭州网站建设开发有限公司
  • 被他人备案后做违法网站抖音seo推广
  • 手机网站广告代码南靖县建设局网站
  • 郑州网站建设智巢高德地图有外资背景吗
  • 网站开发常遇到客户问题wordpress怎么升级
  • 网站的空间是网站 建设 维护 公司
  • 关于网站建设的书籍网站设计的趋势
  • 临漳+网站建设深圳国贸网站建设
  • 安全的南昌网站制作上海网站建设网
  • 360网站制作潍坊医疗网站建设方案
  • 深圳网站策划公司域名解析暂时失败
  • 怎么做安居客网站wordpress 函数文件
  • 微名片网站怎么做html代码表示
  • 两学一做纪实评价系统网站如何做好百度推广
  • 网站设置手机才能播放企业网站开发需求
  • 网站建设微信运营销售做网站用啥语言
  • dw建设网站步骤活动汪活动策划网站
  • 民和县公司网站建设网站开发的特点
  • 模板企业快速建站上传网站中ftp地址写什么
  • 云南本地企业做网站太原网站制作公司哪家好
  • 西部数码域名网站模板wordpress抓取股票行情
  • 丰台深圳网站建设公司关于服装店网站建设的策划方案