回滚

SQLite学习手册(临时文件)

放肆的年华 提交于 2019-11-28 13:29:33
一、简介: 尽管SQLite的数据库是由单一文件构成,然而事实上在SQLite运行时却存在着一些隐含的临时文件,这些临时文件是出于不同的目的而存在的,对于开发者而言,它们是透明的,因此在开发的过程中我们并不需要关注它们的存在。尽管如此,如果能对这些临时文件的产生机制和应用场景有着很好的理解,那么对我们今后应用程序的优化和维护都是极有帮助的。在SQLite中主要产生以下七种临时文件,如: 1). 回滚日志。 2). 主数据库日志。 3). SQL语句日志。 4). 临时数据库文件。 5). 视图和子查询的临时持久化文件。 6). 临时索引文件。 7). VACUUM命令使用的临时数据库文件。 二、具体说明: 1. 回滚日志: SQLite为了保证事物的原子性提交和回滚,在事物开始时创建了该临时文件。此文件始终位于和数据库文件相同的目录下,其文件名格式为: 数据库文件名 + " -journal " 。换句话说,如果没有该临时文件的存在,当程序运行的系统出现任何故障时,SQLite将无法保证事物的完整性,以及数据状态的一致性。该文件在事物提交或回滚后将被立刻删除。 在事物运行期间,如果当前主机因电源故障而宕机,而此时由于回滚日志文件已经保存在磁盘上,那么当下一次程序启动时,SQLite在打开数据库文件的过程中将会发现该临时文件的存在,我们称这种日志文件为"Hot Journal"

详细介绍MySQL/MariaDB的锁

烈酒焚心 提交于 2019-11-28 10:43:15
本文主要记录InnoDB存储引擎中锁的关键点,下篇文章通过实例确认加锁的范围。 InnoDB中的锁 1. 锁提供数据完整性和一致性 2. InnoDB行级锁:共享锁(S)和排他锁(X)。   为了支持多粒度锁定,InnoDB支持意向锁,该锁允许事务在行锁和表锁同时存在。包括意向共享锁(IS)和意向排他锁(IX)。   意向锁将锁定的对象分为多个层次,意味着事务希望在更细粒度上进行加锁,如需要对页上的记录r加X锁,分别需要对数据库、表、页加意向锁IX,最后对记录r加X锁,其中任何一部分导致等待,该操作需要等待粗粒度锁的完成。 3. 锁的查看方式    通过show engine innodb status来查看,其中的transactions片段可以看到事务,其中包括锁等待。   在information_schema架构下,有3个表记录了事务和锁相关的信息。分别是 INNODB_TRX,INNODB_LOCKS,INNODB_LOCK_WAITS 。(具体看书或博客) 4. 一致性非锁读   非锁定读机制,是InnoDB存储引擎的默认设置,默认 读取不会占用和等待表上的锁   InnoDB存储引擎利用 行多版本控制 实现一致性非锁读,   当读取的行正在加X锁DELETE或UPDATE时,读操作不会等待锁释放,会读取行的一个 快照数据   快照数据是指该行之前版本的数据,其通过

分布式事务之解决方案(TCC)

安稳与你 提交于 2019-11-28 10:38:04
4. 分布式事务解决方案之TCC 4.1. 什么是TCC事务 TCC是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作 :预处理Try、确认Confirm、撤销Cancel。Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的操作既回滚操作。TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM会进行重试。 分支事务失败的情况 : TCC分为三个阶段 : Try阶段是做业务检查(一致性)及资源预留(隔离),此阶段仅是一个初步操作,它和后续的Confirm一起才能真正构成一个完整的业务逻辑。 Confirm阶段是做确认提交,Try阶段所有分支事务执行成功后开始执行Confirm。通常情况下,采用TCC则认为Confirm阶段是不会出错的。即 :只要Try成功,Confirm一定成功。若Confirm阶段真的出错了,需引入重试机制或人工处理。 Cancel阶段是在业务执行错误需要回滚的状态下执行分支事务的业务取消,预留资源释放。通常情况下,采用TCC则认为Cancel阶段也是一定成功的。若Cancel阶段真的出错了

重新学习MySQL数据库6:浅谈MySQL的中事务与锁

陌路散爱 提交于 2019-11-28 10:36:27
『浅入深出』MySQL 中事务的实现 在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的;在这篇文章中,我们将对事务的实现进行分析,尝试理解数据库是如何实现事务的,当然我们也会在文章中简单对 MySQL 中对 ACID 的实现进行简单的介绍。 事务其实就是并发控制的基本单位;相信我们都知道,事务是一个序列操作,其中的操作要么都执行,要么都不执行,它是一个不可分割的工作单位;数据库事务的 ACID 四大特性是事务的基础,了解了 ACID 是如何实现的,我们也就清除了事务的实现,接下来我们将依次介绍数据库是如何实现这四个特性的。 原子性 在学习事务时,经常有人会告诉你,事务就是一系列的操作,要么全部都执行,要都不执行,这其实就是对事务原子性的刻画;虽然事务具有原子性,但是原子性并不是只与事务有关系,它的身影在很多地方都会出现。 由于操作并不具有原子性,并且可以再分为多个操作,当这些操作出现错误或抛出异常时,整个操作就可能不会继续执行下去,而已经进行的操作造成的副作用就可能造成数据更新的丢失或者错误。 事务其实和一个操作没有什么太大的区别,它是一系列的数据库操作(可以理解为 SQL)的集合,如果事务不具备原子性,那么就没办法保证同一个事务中的所有操作都被执行或者未被执行了

事务的管理

China☆狼群 提交于 2019-11-28 10:17:37
事务的基本流程: 开启事务:start transaction; 创建一个保存点:savepoint 保存点名 回到保存点(根据具体情况):rollback to保存点名 在MySQL上具体演示: mysql> start transaction; --开启事务 Query OK, 0 rows affected (0.00 sec) mysql> savepoint aa; --设置保存点aa Query OK, 0 rows affected (0.00 sec) mysql> insert into account values(1, '张三', 10); --添加一条记录 Query OK, 1 row affected (0.00 sec) mysql> savepoint bb; -- 设置保存点bb Query OK, 0 rows affected (0.00 sec) mysql> insert into account values(2, '李四', 10000); --再添加一条记录 Query OK, 1 row affected (0.00 sec) mysql> select * from account; --两条记录都在了 +----+--------+----------+ | id | name | balance | +----+-------

Spring中的@Transactional(rollbackFor = Exception.class)属性详解

我的未来我决定 提交于 2019-11-28 06:46:54
序言 一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法; 异常 如下图所示,我们都知道Exception分为运行时异常RuntimeException和非运行时异常 error是一定会回滚的 如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。 如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。 非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。如IOException、SQLException等以及用户自定义的Exception异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。 事务管理方式 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。 spring支持编程式事务管理和声明式事务管理两种方式。   

Spring中的@Transactional(rollbackFor = Exception.class)属性详解

风流意气都作罢 提交于 2019-11-28 06:46:23
序言 今天我在写代码的时候,看到了。一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法; 异常 如下图所示,我们都知道Exception分为运行时异常RuntimeException和非运行时异常 error是一定会回滚的 如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。 如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。 非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。如IOException、SQLException等以及用户自定义的Exception异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。 事务管理方式 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。 spring支持编程式事务管理和声明式事务管理两种方式。   

Spring中的@Transactional(rollbackFor = Exception.class)属性详解

ⅰ亾dé卋堺 提交于 2019-11-28 06:46:05
今天我在写代码的时候,看到了。一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法; 通过上图可看出@Transactional 在那些情况下会失效, 如下图所示,我们都知道Exception分为运行时异常RuntimeException和非运行时异常 error是一定会回滚的 如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。 如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。 非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。如IOException、SQLException等以及用户自定义的Exception异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。 当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。 在项目中,@Transactional

Spring中的@Transactional(rollbackFor = Exception.class)属性详解

笑着哭i 提交于 2019-11-28 06:45:49
序言 今天我在写代码的时候,看到了。一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法; 异常 如下图所示,我们都知道Exception分为运行时异常RuntimeException和非运行时异常 error是一定会回滚的 如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。 如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。 非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。如IOException、SQLException等以及用户自定义的Exception异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。 事务管理方式 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。 spring支持编程式事务管理和声明式事务管理两种方式。   

drop、truncate和delete的区别

南楼画角 提交于 2019-11-28 03:03:17
(1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。 TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。 (2)表和索引所占空间。 当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小, DELETE操作不会减少表或索引所占用的空间。 drop语句将表所占用的空间全释放掉。 (3)执行速度一般而言,drop > truncate > delete (4)应用范围。 TRUNCATE 只能对TABLE; DELETE可以是table和view (5)TRUNCATE 和DELETE只删除数据, DROP则删除整个表(结构和数据)。 (6)truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。 (7)delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的