回滚

数据库事务

眉间皱痕 提交于 2020-01-15 05:34:54
1、什么是事务 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 简单理解,事务就是对数据库一连串的操作,更新、保存和删除,对数据产生变化的操作。 2、为什么需要事务 事务的作用是保证数据准确性和一致性的一种机制。假如没有事务,那我们提交数据不会保存,有异常的时候数据不会回滚。 比如说往银行账户存钱,余额没有添加,去ATM取钱,ATM出故障没吐钱,余额变少了。 3、怎么做 在JAVA开发中通常借助Spring管理事务,大致的原理就是通过AOP在方法前后添加开始事务,提交或回滚的操作。 Spring事务管理分为声明式和编程式两种。 (1)声明式一般是写在配置文件的,它的好处是配置简便,模糊匹配对应的服务方法。 也可以通过注解的方式来开始事务,不过它也是属于声明式。 (2) 编程式 看这个名字大致可以猜出是在我们业务嵌入事务管理代码,好处是事务控制粒度更加细化,缺点是对代码有侵入性。 使用@Transactional来声明事务 当@Transactional作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该注解来覆盖类级别的定义。 @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected

你可能知道事务的四大特性,但是你不一定知道事务的实现原理

天涯浪子 提交于 2020-01-13 20:08:58
说到数据库,那就一定会聊到事务,事务也是面试中常问的问题,我们先来一个面试场景: 面试官:"事务的四大特性是什么?" 我:"ACID,即原子性(Atomicity)、隔离性(Isolation)、持久性(Durability)、一致性(Consistency)!" 面试官:"在 MySQL 数据库的 InnoDB 引擎是怎么实现这四大特性的?" 我:"这个...这个....,还真没有了解过哎" 面试官:"那我们就先这个吧,先回去吧,我们会通知你的~" 这可能是比较常见的面试场景了,你也许回答到了事务的四大特性,但是不一定知道他的实现原理。今天我们就来一起打卡事务的四大特性和实现原理,对于原理的实现,这篇文章只是粗略的介绍一下,更多的细节可以关注我后续的文章。 数据库的事务有四大特性: 原子性、隔离性、永久性、一致性 ,下面将介绍这四大特性的定义和在 InnoDB 引擎中是怎么实现的。 原子性 定义 一次操作是不可分割的,要么全部成功,要么全部失败。比如我们的转账操作,不允许出款方成功,收款方失败这种情况,要么都成功,要么多失败,不可能出现中间状态。 实现 InnoDB 引擎使用 undo log(归滚日志)来保证原子性操作 ,你对数据库的每一条数据的改动(INSERT、DELETE、UPDATE)都会被记录到 undo log 中,比如以下这些操作: 你插入一条记录时

oracle中的一些基本概念

筅森魡賤 提交于 2020-01-13 03:04:52
  Oracle数据库的物理文件是存储在磁盘上的数据文件、控制文件和日志文件的总称。数据文件和日志文件是数据库中最重要的文件。数据库由若干个表空间组成,表空间由表组成,表由段组成,段由区间组成,区间由数据块组成。那么,数据在数据文件中是如何组织的呢?要了解这些内容我们首先必须理解什么是表空间(tablespace)、段(segment)、区(extent)、块(block),这些都是oracle数据库在数据文件中组织数据的基本单元。    块(block) 是数据存储的物理单位,也是数据文件中最基础的单位。数据直接存储在块上,块是oracle空间分配的最小单位。oracle中的块大小常见的有三种:2KB、4KB、8KB。块的大小在数据库创建时就已经固定下来,数据库中每个块的大小都是相同的,而且所有的块都有相同的格式,由“块头+表目录+行目录+空闲空间+数据空间”组成。块头包含着块类型(比如是表块、还是索引块)的信息、磁盘上块的位置等信息。表目录(table directory),如果有的话,包含着此块中存储各行的表的信息(如果一个块中存有多个表中的数据)。行目录(row directory)包含着数据行的描述信息,它是一个指针数组,指示了每一行在数据块中的物理位置。块头、表目录、行目录统称为块开销(block overhead),是oracle用来统计、管理块本身的

oracle回滚

夙愿已清 提交于 2020-01-12 05:14:57
savepoint 回滚点名 rollback to 回滚点名 来源: CSDN 作者: 小毛贼_哪里逃 链接: https://blog.csdn.net/qq_28497823/article/details/103834726

Mysql ------ 索引+ 事务

允我心安 提交于 2020-01-09 23:54:28
文章目录 一、索引: (1)数据库索引: (2)索引的作用: (3)索引分类: (4)创建索引的原则依据: (5)创建索引的办法: 二、事务: (1)事务概念: (2)事务的四大特性: (3)事务的操作: 三、两表相连查询: 一、索引: (1)数据库索引: 1、在数据库中,索引使数据程序无须对整个表进行扫描,就可以在其中找到所需数据; 2、数据库中的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单。 (2)索引的作用: 1、数据库能够大大加快查询速率; 2、降低数据库的 IO 成本,并且索引还可以降低数据库的排序成本; 3、通过创建唯一性索引保证数据表数据的唯一性; 4、加快表与表之间的连接; 5、分组和排序的时候,可以大大减少分组和排序时间 (3)索引分类: 1、普通索引 :最基本的索引类型,而且没有唯一性之类的限制; 2、唯一性索引 :与普通索引基本相似,区别在于,索引列的所有值都只能出现一次,即必须唯一; 3、主键 :主键是一种唯一性索引,必须指定为 “ primary key ” ; 4、全文索引 :mysql 从3.23.23版本开始支持全文索引和全文检索,在mysql 中,全文索引的索引类型为 fulltext ,全文索引可以在 varchar 或者 text 类型的列上创建; 5、单列索引与多列索引:索引可以是单列上创建的索引

数据库事务

纵然是瞬间 提交于 2020-01-09 22:45:17
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。 针对上面的描述可以看出,事务的提出主要是为了解决并发情况下保持数据一致性的问题。 事务具有以下4个基本特征。 ● Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。 ● Consistency(一致性):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。 ● Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。 ● Durability(持久性):事务结束后,事务处理的结果必须能够得到固化。 2.事务的语句  开始事物:BEGIN TRANSACTION  提交事物:COMMIT TRANSACTION  回滚事务:ROLLBACK TRANSACTION 3.事务的4个属性 ①原子性(Atomicity)

Fescar分布式事务实现原理解析探秘

家住魔仙堡 提交于 2020-01-09 13:05:16
前言 fescar发布已有时日,分布式事务一直是业界备受关注的领域,fescar发布一个月左右便受到了近5000个star足以说明其热度。当然,在fescar出来之前,已经有比较成熟的分布式事务的解决方案开源了,比较典型的方案如LCN(https://github.com/codingapi/tx-lcn)的2pc型无侵入事务,目前lcn已发展到5.0,已支持和fescar事务模型类似的TCX型事务。还有如TCC型事务实现hmily(https://github.com/yu199195/hmily)、tcc-transaction(https://github.com/changmingxie/tcc-transaction)等。在微服务架构流行的当下、阿里这种开源大户背景下,fescar的发布无疑又掀起了研究分布式事务的热潮。fescar脱胎于阿里云商业分布式事务服务GTS,在线上环境提供这种公共服务其模式肯定经受了非常严苛的考验。其分布式事务模型TXC又仿于传统事务模型XA方案,主要区别在于资源管理器的定位一个在应用层一个在数据库层。博主觉得fescar的txc模型实现非常有研究的价值,所以今天我们来好好翻一翻fescar项目的代码。本文篇幅较长,浏览并理解本文大概耗时30~60分钟左右。 项目地址 fescar:https://github.com/alibaba

Git undo 操作

谁都会走 提交于 2020-01-09 12:14:44
相比传统的版本管理工具,git 的 undo 操作也不是很简单明了,本文尝试总结常用的 undo 操作。 重新提交 应该避免考虑不周全的提交,但这太难了。因此 Git 专门提供了一个命令来弥补粗心的提交导致的问题。说白了就是让你重新提交一次。 $ git commit --amend 这个命令会重新提交暂存区中的内容。因此你可以重新考虑哪些文件需要提交,并且把这次提交用的 comment 准备好。 为了更好的理解这个命令,我们看看它是怎么工作的。 它相当于下面的两条命令: $ git reset --soft head^ $ git commit -e -F .git/COMMIT_EDITMSG 第一条命令让头指针指向上次的提交,并且不改变暂存区和工作区。 第二条命令是重新提交,并且强制输入提交说明。 回滚暂存区中的变更 我们希望每次提交都是一个相对完整的整体。所以很多时候是提交所有变更文件中的一部分。 举个简单的例子,当前修改了两个文件,希望把它们包含到不同的提交中。所以问题就来了,我们习惯了使用 git add -u 或者 git add . 这样的命令,一不留神就把所有的修改文件添加到了暂存区。 其实 git 已经很殷勤的告诉我们该怎么做了: $ git reset head begin.txt 好了再用 git status 命令看看, begin.txt

通过svn回滚指定版本

做~自己de王妃 提交于 2020-01-09 10:55:50
右击文件(也可以是文件夹),TortoiseSVN – show log,右击你想要回滚到的版本。 “Revert to this revision”,这个比较好理解,也比较常用。就是把文件恢复到某个版本,然后commit,文件就回滚成功了。回滚成功后,所有的历史还存在。例如回滚到版本4,commit之后,会出现新的版本6,但是他的内容和版本4是一样的 来源: https://www.cnblogs.com/ynyhl/p/12169796.html

truncate,delete与drop的区别

人走茶凉 提交于 2020-01-09 01:43:50
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> truncate table命令将快速删除数据表中的所有记录,但保留数据表结构。这种快速删除与delete from 数据表的删除全部数据表记录不一样,delete命令删除的数据将存储在系统回滚段中,需要的时候,数据可以回滚恢复,而truncate命令删除的数据是不可以恢复的 可以做一个测试 建一个带有自增字段的表,加入100万数据 然后分别用TRUNCATE和DELETE删除全部数据 然后再向表里插入一条数据 最直观是: 1.TRUNCATE TABLE是非常快的 2.TRUNCATE之后的自增字段从头开始计数了,而DELETE的仍保留原来的最大数值 ……………………………………………………………………………………………… 注意:这里说的delete是指不带where子句的delete语句 相同点 truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: 1. truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态. 2.delete语句是dml,这个操作会放到rollback