回滚

并发、事务和锁

二次信任 提交于 2019-12-01 20:29:47
并发、事务和锁 并发,在操作系统中,是指一个很短的时间段中有几个程序都处于已启动运行到运行完毕之间,并发程序之间有相互制约关系,直接制约体现为一个程序需要另一个程序的计算结果,间接制约体现为多个程序竞争同一资源,如处理机、缓冲区、数据等。在数据库系统中,并发主要是指资源的争用,当两个进程同时在访问或更新同一个数据时,产生资源的争用,资源争用会引起一系列的问题,比如数据不一致、查询阻塞、死锁等。 一,并发模式 在数据库系统中,当多个进程访问同一资源时,默认情况下,SQL Server会通过各种类型的锁来协调资源的访问,确保在并发环境下数据保持一致的状态。而锁的作用范围是在事务中,事务建立在并发模式下。并发模式控制当发生读写冲突时,数据应该如何处理以保证数据的一致性。注意,写和写之间永远冲突。 1,乐观并发模式 对于乐观并发模式,SQL Server假设只有少量的冲突发生,默认的机制是使用快照技术,在写进程完成修改数据之前,先把数据的行版本保存到tempdb中。由于数据的旧数据已经保存,读进程可以直接读取已经保存的行版本,而不会受到写进程的影响。 乐观并发使得读写进程不会相互阻塞,但是,这会导致一个潜在的问题,读进程可能会读取到老的数据。 2,悲观并发模式 这是默认的并发模式,在悲观并发模式下,SQL Server认为有大量的写操作发生,并且写操作会受到写操作的影响。也就是说

PHP PDO 事务与自动提交

旧街凉风 提交于 2019-12-01 19:03:38
现在通过 PDO 连接上了,在开始进行查询前,必须先理解 PDO 是如何管理事务的。 事务支持四大特性(ACID): 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability) 通俗地讲,在一个事务中执行的任何操作,即使是分阶段执行的,也能保证安全地应用于数据库,并在提交时不会受到来自其他连接的干扰。 事务操作也可以根据请求自动撤销(假设还没有提交),这使得在脚本中处理错误更加容易。 事务通常是通过把一批更改"积蓄"起来然后使之同时生效而实现的;这样做的好处是可以大大地提供这些更改的效率。 换句话说,事务可以使脚本更快,而且可能更健壮(不过需要正确地使用事务才能获得这样的好处)。 不幸的是,并非每种数据库都支持事务,因此当第一次打开连接时,PDO 需要在所谓的"自动提交"模式下运行。 自动提交模式意味着,如果数据库支持,运行的每个查询都有它自己的隐式事务,如果数据库不支持事务,则没有。 如果需要一个事务,则必须用 PDO::beginTransaction() 方法来启动。如果底层驱动不支持事务,则抛出一个 PDOException 异常(不管错误处理设置是怎样的,这都是一个严重的错误状态)。 一旦开始了事务,可用 PDO::commit() 或 PDO::rollBack()来完成,这取决于事务中的代码是否运行成功

深入学习MySQL事务:ACID特性的实现原理

邮差的信 提交于 2019-12-01 19:01:21
事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段。 本文将首先介绍 MySQL 事务相关的基础概念,然后介绍事务的ACID 特性,并分析其实现原理。 MySQL博大精深,文章疏漏之处在所难免,欢迎批评指正。 一、基础概念 事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。作为一个关系型数据库,MySQL支持事务,本文介绍基于MySQL5.6。 首先回顾一下MySQL事务的基础知识。 (1). 逻辑架构和存储引擎 图片来源:https://blog.csdn.net/fuzhongmin05/article/details/70904190 如上图所示,MySQL服务器逻辑架构从上往下可以分为三层: (1)第一层:处理客户端连接、授权认证等。 (2)第二层:服务器层,负责查询语句的解析、优化、缓存以及内置函数的实现、存储过程等。 (3)第三层:存储引擎,负责MySQL中数据的存储和提取。 MySQL 中服务器层不管理事务,事务是由存储引擎实现的。 MySQL支持事务的存储引擎有InnoDB、NDB Cluster等,其中InnoDB的使用最为广泛;其他存储引擎不支持事务,如MyIsam、Memory等。 如无特殊说明,后文中描述的内容都是基于InnoDB。 (2).

多个数据库事务

蓝咒 提交于 2019-12-01 18:57:42
在我的PHP应用程序(使用symfony框架和Propel ORM构建)中,当我向MYSQL数据库添加记录时,我需要使用外部供应商提供的Web服务API更新外部MYSQL数据库。 问题是维护数据库完整性的最佳实践是什么。 举例来说,如果第一次更新成功,而第二次更新不成功,由于Web服务不可用,我必须能够 回滚第一次更新的事务,或 缓存对Web服务的调用,并继续调用Web服务,直到服务可用 一些其他可以保持多个数据库完整性的技术。 具体来说,我正在寻找类似的语法 void RootMethod() { using(TransactionScope scope = new TransactionScope()) { try { SomeMethod(); scope.Complete(); CallWebService(); } catch { scope.abort(); } } } 但不确定是否 这是一个很好的技术 或者这在symfony中是可行的,就像在C#中一样 你怎么看? 编辑:有人问我为什么需要两部分更新。 这是因为我正在创建一个连接到现有后端应用程序的前端应用程序。 我不想改变后端应用程序。 因此不可避免地会有一些重叠。 因此需要同步数据 另一个编辑:两部分事务必须一起完成,做一个cron作业同步表是不可取的 #1楼 这将是棘手的。 您需要2阶段提交才能获得可靠的解决方案

MySQL的闪回策略

我怕爱的太早我们不能终老 提交于 2019-12-01 17:01:57
闪回原理   既然 binlog 以 event 形式记录了所有的变更信息,那么我们把需要回滚的 event ,从后往前回滚回去即可。   对于单个 event 的回滚,我们以表 test.user 来演示原理   mysql> show create table test.user \G   ******************1. row************************   Table: user   Create Table: CREATE TABLI ‘user’ (‘id’ int(11) NOT NULL AUTO_INCREMENT,’name’ varchar(10) DEFAULT NULl PRIMARY KEY (‘id’) ENGINE=InnoDB AUTO INCREMENT=6 DEFAULT CHARSET=utf8 对于 delete 操作 , 我们从 b inlog 提取出 delete 信息 ,反向 生成的回滚语句是 Insert 。 ( 注 : 为了方便解释 , 我们用 binlog2sq l 将原始 binlog 转化成了可读 SQL)   原始: DELETE FROM test, user where id=1 AND ‘name’=’ 小赵 ’;   回滚: INSERT INTO test.user(id,name)

微服务下分布式事务解决方案

让人想犯罪 __ 提交于 2019-12-01 16:24:30
摘抄并学习 1. 微服务的发展   微服务倡导将复杂的单体应用拆分成若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性。便于敏捷开发。当前微服务的开发框架非常多,比较著名的有 Dubbo、SpringCloud、thrift、grpc 等。 2. 微服务落地存在的问题   虽然现在微服务如火如荼,但对其实践仍处于探索阶段。很多中小型互联网公司鉴于经验技术实力等问题,微服务落地比较困难。主要有以下几个方面:   1)单体应用拆分为分布式系统后,进程间的通讯机制和故障处理措施变得更加复杂。   2)系统微服务化后,一个看似简单的功能,内部可能需要调用多个服务并操作多个数据库实现,服务调用的分布式事务问题非常突出。   3)微服务数量众多,其测试、部署、监控等都变得更加困难   随着 RPC(远程过程调用 Remote Procedure Call) 框架的成熟,第一个问题已经逐渐得到解决。例如 dubbo 可以支持多种通讯协议,springcloud 可以非常好的支持 restful 调用。对于第二个问题,现在还没有通用方案很好的解决微服务产生的事务问题。分布式事务已经成为微服务落地最大的阻碍,也是最具挑战性的一个技术难题。   以下介绍分布式事务的各种解决方案,重点解读阿里巴巴提出的分布式事务解决方案 —— GTS。 3. SOA分布式事务解决方案 3.1 基于 XA

简单聊聊事物的四大特性,四大特性的实现原理。

情到浓时终转凉″ 提交于 2019-12-01 16:07:03
事物的四大特性? ACID 1.原子性 atomicity 一个事物是一个不可分割的工作单位,其中的操作,要么都做,要么不做。不存在中间状态。 2.一致性 consisitency 事物执行的前后,数据必须处于一种合法的状态。(可以自己定义 ,保持数据的一致性。) 3.隔离性 lsolation 多个事物并发执行的时候,事物内部的操作与其他事物是隔离的,并发执行,互不干扰。 4.持久性 Durability 事物一旦提交,对数据库的改变是永久性的。不受任何影响。 四大特性的实现原理? 1.mysql如何保证一致性的? 两个层面。 /* 1.数据库 通过原子性, 持久性,隔离性,来保证一致性。 AID 三大特性,是前提。 2.应用层面 通过代码判断数据库数据是否有效,然后再决定是回滚还是提交数据。 */ 2.mysql怎怎么保证原子性的? /* 1.利用innodb的undo log。 叫做回滚的日志 当事务回滚的时候,能够撤销所有已经成功执行的SQL语句,需要记录你要回滚的响应日志 2.举例说明 当你update一条数据,需要记录之前的旧值,回滚的时候,根据旧值进行update操作。 undo log 记录了这些回滚需要的信息,当事务执行失败,就可以以利undo log 中的信息 将数据回滚到修改之前的样子。 */ 3.mysql怎么保持久性的? /* 1. 是利用innodb 的

远程调用时的分布式事物问题

只愿长相守 提交于 2019-12-01 15:51:30
前提 所有服务均有独立的事物管理机制,相互间没有任何关联. 所有业务接口都有对应的补偿方法,用于将已经更新的数据还原到上一次的状态. 本次实例为同步业务,理想状态下,只有全部成功或全部失败两种情况. 正式开始 正常流程 一切安好. 中途异常 - 补偿成功 虽然发生了失败,但所有补偿都成功了.没有什么问题 中途异常 - 补偿失败 此时,主服务有三种处理方法 主服务无限重试补偿方法,直到补偿成功. 这里有很麻烦的问题,如果下游的服务器已经停机,此时主服务的无限重试已经没有意义.在最坏的情况下,如果主服务访问量过大,而因为业务相同,主 服务的线程池中的全部线程将全部处于阻塞状态,失去处理新请求的能力. 同时,访问主服务的客户端有可能会放弃本次的连接,导致正在重试中的线程被回收,丢失所有状态 主服务尽可能调用补偿方法,并回滚自身事物,同时通知备用方案 这里依靠备用方案对失败的补偿调用进行异步异步调用,已达到"最终一致"的效果.备用方案一般需要集成"可靠消息系统" 主服务直接放弃补偿与自身的回滚,并通知备用方案 与2基本相同.在调用链比较长的情况下且补偿随机性失败,从上层看,2方案的调用结果(备用方案未执行时)将成锯齿状.而本方案,其对应 的消费者直接以级联方式进行补偿的调用,最终完成全部补偿调用与主方法数据回滚,同样从上层看,方案3的调用结果(备用方案未执行时)将是平整的(只有失败处断裂)

(转)MySQL日志系统

☆樱花仙子☆ 提交于 2019-12-01 13:09:39
原文: https://www.cnblogs.com/roverliang/p/6414457.html MySQL 日志系统 做过大型系统的都知道,日志的作用不用小觑,往往到了项目中后期,对项目进行优化升级都是依据日志做出升级优化的决策的。那么学习MySQL,日志部分当然不能错过。我们面试中实际应用的所谈到的优化都是要从日志中得出来的。系统的学习mysql的日志,有助于我们准确的定位问题,提高自己的工作水平。此外,后面的一系列日志会重点从DBA的运维方面进行着手,系统的去理解MySQL各方面的配置,做到知己知彼,让MySQL成为自己得心应手的数据仓库。 一、MySQL的日志类型 默认情况下,所有的MySQL日志以文件的方式存放在数据库根目录下: [root@roverliang data]# pwd /usr/local/webserver/extend_lib/mysql/data [root@roverliang data]# ls auto.cnf ibdata1 ib_logfile0 ib_logfile1 mysql mytest performance_schema roverliang roverliang.err roverliang.pid test MySQL的日志类型有以下几种: 1. 错误日志(error),MySQL服务实例启动

svn回退到某一版本

心已入冬 提交于 2019-12-01 11:56:33
1、保证我们拿到的是最新代码: svn update 假设最新版本号是28。 2、然后找出要回滚的确切版本号: svn log 假设根据svn log日志查出要回滚的版本号是25,此处的something可以是文件、目录或整个项目 如果想要更详细的了解情况,可以使用svn diff -r 28:25 "" 3、回滚到版本号25: svn merge -r 28:25 "" 为了保险起见,再次确认回滚的结果: svn diff "" 发现正确无误,提交。 4、提交回滚: svn commit -m "Revert revision from r28 to r25,because of ..." 提交后版本变成了29。 分类: 软件使用svn 转自: https://www.cnblogs.com/helloweworld/p/4024605.html 来源: https://www.cnblogs.com/xh_Blog/p/11684393.html