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

百度网站空间湖南做网站seo

百度网站空间,湖南做网站seo,明远建设是哪里的,网页平台一、数据库事务概述 事务是数据库区别于文件系统的重要特性之一 #xff08;1#xff09;存储引擎支持情况 SHOW ENGINES命令来查看当前MySQL支持的存储引擎都有哪些#xff0c;以及这些存储引擎是否支持事务能看出在MySQL中#xff0c;只有InnoDB是支持事务的 #x…一、数据库事务概述 事务是数据库区别于文件系统的重要特性之一 1存储引擎支持情况 SHOW ENGINES命令来查看当前MySQL支持的存储引擎都有哪些以及这些存储引擎是否支持事务能看出在MySQL中只有InnoDB是支持事务的 2基本概念 事务一组逻辑操作单元使数据从一种状态变换到另一种状态事务处理的原则保证所有事务都作为一个工作单元来执行。当在一个事务中执行多个操作时1要么所有的修改都被提交commit那么这些修改就永久地保存下来2要么数据库管理系统放弃所作的所有修改整个事务回滚rollback到最初状态 3事务的ACID特性 1.3.1原子性 原子性事务是一个不可分割的工作单位要么全部提交要么全部失败回滚不存在中间的状态 1.3.2一致性 一致性事务执行前后数据从一个合法性状态变换到另一个合法性状态合法的数据状态满足预定的约束的状态就叫做合法的状态举例1A账户有200元转账300元出去此时A账户余额为-100元。你自然就发现了此时数据是不一致的为什么呢因为你定义了一个状态余额这列必须0举例2A账户200元。转账50元给B账户A账户的钱扣了但是B账户因为各种意外余额并没有增加。你也知道此时数据是不一致的为什么呢因为你定义了一个状态要求AE的总余额必须不变举例3在数据表中将姓名字段设置为唯一性约束这时当事务进行提交或者事务发生回滚的时候如果数据表中的姓名不唯一就破坏了事务的一致性要求 1.3.3隔离性 隔离性即并发执行的各个事务之间不能相互干扰如果无法保证隔离性会怎么样假设A账户有200元B账户0元。A账户往B账户转账两次每次金额为50元分别在两个事务中执行。如果无法保证隔离性会出现下面的情形 UPDATE accounts SET money money - 50 WHERE NAME AA; UPDATE accounts SET money money 50 WHERE NAME BB; 1.3.4持久性 持久性一个事务一旦被提交它对数据库中数据的改变就是永久性的 持久性是通过事务日志来保证的。日志包括了重做日志和回滚日志。当我们通过事务对数据进行修改的时候1首先会将数据库的变化信息记录到重做日志中2然后再对数据库中对应的行进行修改 这样做的好处是即使数据库系统崩溃也能找到重做日志重新执行从而使事务具有持久性 事务把需要保证原子性、隔离性、一致性和持久性的一组数据库操作称为一个事务 4事务的状态 事务对应着一个或多个数据库操作MySQL根据这些操作所执行的不同阶段把事务大致划分成几个状态 活动的active事务对应的数据库操作正在执行过程中时我们就说该事务处在活动的状态部分提交的partially committed当事务中的最后一个操作执行完成但由于操作都在内存中执行所造成的影响并没有刷新到磁盘时我们就说该事务处在部分提交的状态失败的failed当事务处在活动的或者部分提交的状态时可能遇到了某些错误数据库自身的错误、操作系统错误或者直接断电等而无法继续执行或者人为地停止当前事务的执行我们就说该事务处在失败的状态中止的aborted如果事务执行了一部分而变为失败的状态那么就需要把已经修改的事务中的操作还原到事务执行前的状态。我们把这个过程称之为回滚。当回滚操作执行完毕时我们就说该事务处在了中止的状态提交的committed当处在一个部分提交状态的事务将修改过的数据都同步到磁盘上之后我们就可以说事务处在了提交的状态 一个基本的状态转换图如下所示 图中可见只有当事务处于提交的刷新到磁盘或者中止的回滚操作执行完状态时一个事务的生命周期才算是结束了 二、如何使用事务 使用事务有两种方式分别为显式事务和隐式事务 事务的完成过程 步骤一开启事务步骤二一系列的DML操作......步骤三事务结束的状态提交的状态(COMMIT) 、 中止的状态(ROLLBACK) 1显式事务 步骤一显式开启一个事务 SQL语句 BEGIN; #或者 START TRANSACTION; START TRANSACTION语句相较于BEGIN特别之处在于后面能跟随几个修饰符                                                                                                                                              ① 修饰符 READ ONLY。标识当前事务是一个只读事务也就是属于该事务的数据库操作只能读取数据而不能修改数据只读事务中只是不允许修改那些其他事务也能访问到的表中的数据对于临时表来说使用CREATE TMEPORARY TABLE创建的表由于它们只能在当前会话中可见所以只读事务其实也是可以对临时表进行增、删、改操作的                                                                                                             ② 修饰符 READ WRITE。标识当前事务是一个读写事务也就是属于该事务的数据库操作既可以读取数据也可以修改数据                                                                     ③ 修饰符 WITH CONSISTENT SNAPSHOT。启动一致性读比如 START TRANSACTION READ ONLY;#开启一个只读事务 START TRANSACTION READ ONLY,WITH CONSISTENT SNAPSHOT;#开启只读事多和一致性读 START TRANSACTION READ WRITE,WITH CONSISTENT SNAPSHOT;#开启读写事务和一致性读 注意1READ ONLY和READ WRITE是用来设置所谓的事务访问模式的就是以只读还是读写的方式来访问数据库中的数据一个事务的访问模式不能同时既设置为只读的又设置为读写的2如果不显式指定事务的访问模式那么该事务的访问模式就是读写模式 步骤二一系列事务中的操作主要是DML不含DDL步骤三提交事务或中止事务即回滚事务 # 提交事务。当提交事务后对数据库的修改是永久性的 COMMIT; # 回滚事务。即撤销正在进行的所有没有提交的修改 ROLLBACK; # 将事务回滚到某个保存点 ROLLBACK TO [SAVEPOINT]; 其中关于SAVEPOINT保存点相关的操作有 #在事务中创建保存点方便后续针对保存点进行回滚。一个事务中可以存在多个保存点 SAVEPOINT 保存点名称; #删除某个保存点 RELEASE SAVEPOINT 保存点名称; 2隐式事务 MySQL中有一个系统变量autocommitautocommit默认是ON。此时每一个DML都是一个独立的事务如果想关闭这种自动提交的功能 方式一针对于DML操作是有效的,对DDL操作是无效的 SET autocommit OFF; #或 SET autocommit 0; #或 SET autocommit FALSE; 方式二我们在autocommit为ONTRUE/1的情况下使用start transaction或begin开启事务则DML操作就不会自动提交数据 补充Oracle默认不自动提交需要手写COMMIT命令而MySQL 默认自动提交  3隐式提交数据的情况 数据定义语言Data Definition Language缩写为DDL数据库对象指的就是数据库、表、视图、存储过程等结构。当使用CREATE、ALTER、DROP等语句去修改数据库对象时就会隐式的提交前边语句所属于的事务。即 BEGIN; SELECT ... #事务中的一条语句 UPDATE ...#事务中的一条语句 ... #事务中的其它语句 CREATE TABLE ...# 此语句会隐式的提交前边语句所属于的事务 隐式使用或修改mysql数据库中的表DCL当使用ALTER USER、CREATE USER、DROP USER 、RENAME USER、GRANT、REVOKE、SET PASSWORD等语句时也会隐式的提交前边语句所属于的事务1当在一个事务还没提交或者回滚时就又使用START TRANSACTION或者BEGIN语句开启了另一个事务时会隐式的提交上—个事务2当前的autocommit系统变量的值为OFF我们手动把它调为ON时也会隐式的提交前边语句所属的事务3使用LOCK TABLES、UNLOCK TABLES等关于锁定的语句也会隐式的提交前边语句所属的事务加载数据的语句使用LOAD DATA语句来批量往数据库中导入数据时也会隐式的提交前边语句所属的事务关于MySQL复制的一些语句使用START SLAVE、STOP SLAVE、RESET SLAVE、CHANGE MASTER TO等语句时会隐式的提交前边语句所属的事务主从复制其它的一些语句使用ANALYZE TABLE、CACHE INDEX、CHECK TABLE、FLUSH、LOAD INDEX INTO CACHE、0PTIMIZE TABLE、REPAIR TABLE、RESET等语句也会隐式的提交前边语句所属的事务 4使用举例1提交与回滚 测试代码 # 案例分析 #SET autocommit TRUE; #SHOW VARIABLES LIKE autocommit; #举例1 commit 和 rollbackUSE atguigudb2; #情况1 CREATE TABLE user3(NAME VARCHAR(15) PRIMARY KEY);SELECT * FROM user3;BEGIN; INSERT INTO user3 VALUES(张三); #此时不会自动提交数据 COMMIT;BEGIN; #开启一个新的事务 INSERT INTO user3 VALUES(李四); #此时不会自动提交数据 INSERT INTO user3 VALUES(李四); #受主键的影响不能添加成功 ROLLBACK;SELECT * FROM user3;#情况2 TRUNCATE TABLE user3; #DDL操作会自动提交数据不受autocommit变量的影响。SELECT * FROM user3;BEGIN; INSERT INTO user3 VALUES(张三); #此时不会自动提交数据 COMMIT;INSERT INTO user3 VALUES(李四);# 默认情况下(即autocommit为true)DML操作也会自动提交数据。 INSERT INTO user3 VALUES(李四); #事务的失败的状态ROLLBACK;SELECT * FROM user3;#情况3 TRUNCATE TABLE user3;SELECT * FROM user3;SELECT completion_type;#默认值是NO_CHAIN即0SET completion_type 1;BEGIN; INSERT INTO user3 VALUES(张三); COMMIT;SELECT * FROM user3;INSERT INTO user3 VALUES(李四); INSERT INTO user3 VALUES(李四); ROLLBACK;SELECT * FROM user3;  MySQL中completion_type参数的作用实际上这个参数有3种可能 completion0这是默认情况。当执行COMNIT的时候会提交事务在执行下一个事务时还需要使START TRANSACTION 或者BEGIN来开启completion1这种情况下当提交事务后相当于执行了COMMIT AND CHAIN也就是开启一个链式事务即提交事务之后会开启一个相同隔离级别的事务completion2这种情况下当提交事务后相当于执行了COMMIT AND RELEASE也就是提交后会自动与服务器断开连接 注意 当我们设置autocommit0时每一个DML都是一个独立的事务和事务一样都需要COMMIT/ROLLBACK当我们设置autocommit1时每一个DML都会自动提交但事务需要COMMIT/ROLLBACK我们谈到的事务基本都是显式事务。所谓的隐式事务就是每一个DML根据autocommit的值来判断是否会自动提交 5使用举例2测试不支持事务的engine 测试代码 #举例2体会INNODB 和 MyISAMCREATE TABLE test1(i INT) ENGINE INNODB;CREATE TABLE test2(i INT) ENGINE MYISAM;#针对于innodb表 BEGIN; INSERT INTO test1 VALUES (1); ROLLBACK;SELECT * FROM test1;#针对于myisam表:不支持事务 BEGIN; INSERT INTO test2 VALUES (1); ROLLBACK;SELECT * FROM test2; 6使用举例3SAVEPOINT 测试代码 #举例3体会savepointCREATE TABLE user3(NAME VARCHAR(15),balance DECIMAL(10,2));show variables like autocommit; set autocommit 0; truncate table user3;BEGIN; INSERT INTO user3(NAME,balance) VALUES(张三,1000); COMMIT;SELECT * FROM user3;BEGIN; UPDATE user3 SET balance balance - 100 WHERE NAME 张三;UPDATE user3 SET balance balance - 100 WHERE NAME 张三;SAVEPOINT s1;#设置保存点UPDATE user3 SET balance balance 1 WHERE NAME 张三;ROLLBACK TO s1; #回滚到保存点SELECT * FROM user3;ROLLBACK; #回滚操作SELECT * FROM user3; 注意 COMMIT是把在内存中修改好的数据刷新到磁盘上ROLLBACK可以理解成是把硬盘中相应的数据恢复到事务开始之前的状态COMMIT和ROLLBACK都是代表事务的结束 三、事务隔离级别 MySQL是一个客户端/服务器架构的软件。对于同一个服务器来说可以有若干个客户端与之连接每个客户端与服务器连接上之后就可以称为一个会话session。每个客户端都可以在自己的会话中向服务器发出请求语句一个请求语句可能是某个事务的一部分也就是服务器来说可能同时处理多个事务。事务具有隔离性的特性理论上在某个事务对某个数据进行访问的时候其他事务应该排队当该事务提交之后其它事务才可以继续访问这个数据。但是这样对性能影响太大我们既想保持事务的隔离性又想让服务器在处理访问统一数据的多个事务时性能尽量高些那就看二者如何权衡取舍了 1数据准备 创建一个表 CREATE TABLE student ( studentno INT, name VARCHAR(20), class varchar(20), PRIMARY KEY (studentno) ) EngineInnoDB CHARSETutf8; 然后向这个表里插入一条数据 INSERT INTO student VALUES(1, 小谷, 1班); 现在表里的数据就是这样的 select * from student; 2数据并发问题 事务的隔离性和并发性如何取舍先看一下访问相同数据的事务在不保证串行也就是执行完一个再执行另一个执行的情况下也即并发可能出现哪些问题 3.2.1脏写Dirty Write 对于两个事务Session A、Session B如果事务Session A修改了另一个未提交的事务Session B修改过的数据那就意味着发生了脏写两个并发事务一个事务导致另一个事务对数据的修改丢失了。也即写的东西丢了1Session A和Session B各自开启了一个事务2Session B中的事务先将studentno列为1的记录的name字段更新为“李四”然后Session A中的事务接着又把这条studentno列为1的记录的name列更新为“张三”。3如果之后Session B中的事务进行了回滚那么Session A中的更新也将不复存在这种现象就称之为脏写。这时Session A中的事务就没有效果了明明把数据更新了最后也提交事务了最后看到的数据什么变化也没有 3.2.2脏读Dirty Read 对于两个事务Session A、Session BSession A读取了已经被SessionB更新但还没有被提交的字段。之后若Session B回滚Session A读取的内容就是临时且无效的两个并发事务一个事务读到了另一个事务中会丢失的修改。也即读到了不存在的东西 1Session A和Session B各开启了一个事务2Session B中的事务先将studentno列为1的记录的name列更新为“张三”3然后Session A中的事务再去查询这条studentno为1的记录如果读到列name的值为“张三”4而Session B中的事务稍后进行了回滚那么Session A中的事务相当于读到了一个不存在的数据这种现象就称之为脏读 3.2.3不可重复读Non-Repeatable Read 对于两个事务Session A、Session BSession A 读取了一个字段然后Session B更新了该字段。之后Session A再次读取同一个字段值就不同了。那就意味着发生了不可重复读此时在Session B中提交了几个隐式事务注意是隐式事务意味着语句结束事务就提交了这些事务都修改了studentno列为1的记录的列name的值每次事务提交之后如果Session A中的事务都可以查看到最新的值这种现象也被称之为不可重复读  3.2.4幻读Phantom 对于两个事务Session A、Session BSession A 从一个表中读取了一个字段然后 Session B 在该表中插入了一些新的行。之后如果 Session A 再次读取同一个表就会多出几行。那就意味着发生了幻读 1Session A中的事务先根据条件studentno 0这个条件查询表student得到了name列值为’张三’的记录2之后Session B中提交了一个隐式事务该事务向表student中插入了一条新记录3之后Session A中的事务再根据相同的条件studentno 0查询表student得到的结果集中包含Session B中的事务新插入的那条记录这种现象也被称之为幻读 。我们把新插入的那些记录称之为幻影记录 注意1如果Session B中删除了一些符合studentno 0的记录而不是插入新记录那SessionA之后再根据studentno 0的条件读取的记录变少了这种现象不属于幻读幻读强调的是一个事务按照某个相同条件多次读取记录时后读取时读到了之前没有读到的记录 注意2那对于先前已经读到的记录之后又读取不到这种情况算啥呢这相当于对每一条记录都发生了不可重复读的现象。幻读只是重点强调了读取到了之前读取没有获取到的记录 3SQL中的四种隔离级别 按严重性排序脏写脏读不可重复读幻读隔离级别越低并发问题发生的就越多。SQL标准中设立了4个隔离级别这四个都解决了脏写的问题 READ UNCOMMITTED读未提交在该隔离级别所有事务都可以看到其他未提交事务的执行结果。不能避免脏读、不可重复读、幻读READ COMMITTED读已提交它满足了隔离的简单定义一个事务只能看见已经提交事务所做的改变。这是大多数数据库系统的默认隔离级别但不是MySQL默认的。可以避免脏读但不可重复读、幻读问题仍然存在REPEATABLE READ可重复读事务A在读到一条数据之后此时事务B对该数据进行了修改并提交那么事务A再读该数据读到的还是原来的内容。可以避免脏读、不可重复读但幻读问题仍然存在。这是MySQL的默认隔离级别SERIALIZABLE可串行化确保事务可以从一个表中读取相同的行。在这个事务持续期间禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都可以避免但性能十分低下 隔离级别越高数据库的并发性能就越差4种事务隔离级别与并发性能的关系如下 4MySQL支持的四种隔离级别 不同的数据库厂商对SQL标准中规定的四种隔离级别支持不一样。比如Oracle就只支持READ COMMITTED默认隔离级别和SERIALIZABLE隔离级别。MySQL虽然支持4种隔离级别但MySQL在REPEATABLE READ隔离级别下是可以禁止幻读问题的发生的看16章 MySQL的默认隔离级别为REPEATABLE READ查看事务的隔离级别 # 查看隔离级别MySQL 5.7.20的版本之前 SHOW VARIABLES LIKE tx_isolation;# 查看隔离级别MySQL 5.7.20的版本及之后 SHOW VARIABLES LIKE transaction_isolation;#或者不同MySQL版本中都可以使用的 SELECT transaction_isolation; 5如何设置事务的隔离级别 通过下面的语句修改事务的隔离级别两种方式 SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL 隔离级别; #其中隔离级别格式READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLESET [GLOBAL|SESSION] TRANSACTION_ISOLATION 隔离级别 #其中隔离级别格式READ-UNCOMMITTEDREAD-COMMITTEDREPEATABLE-READSERIALIZABLE 关于设置时使用GLOBAL或SESSION的影响 使用GLOBAL关键字在全局范围影响使用SESSION关键字在会话范围影响 6不同隔离级别举例 初始化数据 create table account(id int primary key auto_increment,name varchar(15),balance decimal(10,2) ); TRUNCATE TABLE account;INSERT INTO account VALUES (1, 张三,100 ),(2,李四,0); 表中数据如下 SELECT * FROM account; 演示1 读未提交之脏读 设置隔离级别为未提交读事务1和事务2的执行流程如下 演示2 读已提交设置隔离级别为可重复读事务的执行流程如下 演示4幻读 四、事务的常见分类 从理论的角度可以把事务分为以下几种类型 扁平事务Flat Transactions 带有保存点的扁平事务Flat Transactions with Savepoints 链事务Chained Transactions 嵌套事务Nested Transactions 分布式事务Distributed Transactions 下面分别介绍这几种类型 扁平事务1事务类型中最简单的一种但是实际生产环境中使用最频繁的事务故每个数据库系统都实现了对扁平事务的支持。在扁平事务中所有操作都处于同一层次其由BEGIN开始由COMMIT或ROLLBACK结束其间的操作是原子的要么都执行要么都回滚。扁平事务的主要限制是不能提交或者回滚事务的某一部分2扁平事务一般有三种不同的结果 ① 事务成功完成 ② 应用程序要求停止事务。比如应用程序在捕获到异常时会回滚事务 ③ 外界因素强制终止事务。如连接超时或连接断开带有保存点的扁平事务1除了支持扁平事务支持的操作外还允许在事务执行过程中回滚到同一事务中较早的一个状态。这是因为某些事务可能在执行过程中出现的错误并不会导致所有的操作都无效放弃整个事务不合乎要求开销太大2对于扁平的事务来说隐式的设置了一个保存点在整个事务中只有这一个保存点因此回滚只能会滚到事务开始时的状态链事务1链事务是指一个事务由多个子事务链式组成它可以被视为保存点模式的一个变种。带有保存点的扁平事务当发生系统崩溃时所有的保存点都将消失这意味着当进行恢复时事务需要从开始处重新执行而不能从最近的一个保存点继续执行2链事务的思想是在提交一个事务时释放不需要的数据对象将必要的处理上下文隐式地传给下一个要开始的事务前一个子事务的提交操作和下一个子事务的开始操作合并成一个原子操作这意味着下一个事务将看到上一个事务的结果就好像在一个事务中进行一样。这样在提交子事务时就可以释放不需要的数据对象而不必等到整个事务完成后才释放3其工作方式如下嵌套事务由一个顶层事务Top-Level Transaction控制着各个层次的事务顶层事务之下嵌套的事务被称为子事务(Subtransaction)其控制着每一个局部的变换子事务本身也可以是嵌套事务。因此嵌套事务的层次结构可以看成是一棵树分布式事务通常是在一个分布式环境下运行的扁平事务因此需要根据数据所在位置访问网络中不同节点的数据库资源。例如一个银行用户从招商银行的账户向工商银行的账户转账1000元这里需要用到分布式事务因为不能仅调用某一家银行的数据库就完成任务 链事务与带有保存点的扁平事务的不同之处体现在 带有保存点的扁平事务能回滚到任意正确的保存点而链事务中只能恢复到最近的一个保存点 对于锁的处理两者也不相同链事务在执行COMMIT后即释放了当前所持有的锁而带有保存点的扁平事务不影响迄今为止所持有的锁
http://www.hkea.cn/news/14349974/

相关文章:

  • 承包工程在哪个网站百度导航最新版本
  • 青岛网站建设开发外包qq是由哪家公司开发的
  • 驾校网站建设方案徐州网络推广
  • 网站 拉新专题网站建设策划
  • 新河企业做网站网页设计是学什么的
  • 济南网站制作创意四川省微信网站建设公
  • 阿里云服务器建立网站云南有哪些城市
  • 怎么把别人网站的tag写上自己的做国外网站选择vps
  • 重庆网站建设软件群晖wordpress 证书
  • 东坑东莞微信网站建设前端开发兼职的未来发展
  • 专门做销售培训的网站微信开发者平台api
  • 验证网站所有权比较好的建立站点
  • 网站流量降低淄博做网站seo
  • wordpress网站加密物联网就业方向及前景
  • 怎么做网站内部链接的优化昆明做网站优化哪家好
  • 怎么做自己的音乐网站廊坊短视频优化
  • 网站制作实例长沙seo搜索
  • 公司网站模板设计炫丽的网站
  • 如何免费做网站网站目标关键词
  • 用名字做头像是什么网站网站分几个阶段建设
  • 网站设计拓扑图wordpress to cms
  • 天津网站建设服务公司深圳营销型网站建设公司选择哪家好
  • 一般做哪些外贸网站网站建设流程图visio
  • 江苏网站建设手机网站首页经典案例
  • 电子商务网站推广怎么做电影网站
  • 提供网站建设服务的网站android网站开发实例
  • 现在的网站推广是怎么做的凡科是免费做网站吗
  • 建站之星网站国家企业信用信息公示网查询
  • 顺德网站制作案例机构任何小说都能搜到的软件
  • 做特价的网站百度久久建筑服务网