回滚

Sql Server Tempdb原理-日志机制解析实践

断了今生、忘了曾经 提交于 2019-12-01 00:57:15
笔者曾经在面试DBA时的一句”tempdb为什么比其他数据库快?”使得95%以上的应试者都一脸茫然.Tempdb作为Sqlserver的重要特征,一直以来大家对它可能即熟悉又陌生.熟悉是我们时时刻刻都在用,陌生可能是很少有人关注它的运行机制.这次我将通过实例给大家介绍下tempdb的日志机制. 测试用例 我们分别在用户数据库(testpage),tempdb中创建相似对象t1,#t1,并在tempdb中创建创建非临时表,然后执行相应的insert脚本(用以产生日志),并记录执行时间用以比较用以比较说明tempdb”快” Code 用户数据库testpage use testpage go create table t1 ( id int identity(1,1) not null, str1 char(8000) ) declare @t datetime2=sysutcdatetime() declare @i int set @i=1 while (@i<100000) begin insert into t1 select @i,'aa' select @i=@i+1 end select [extime]=DATEDIFF(S,@t,sysutcdatetime()) tempdb use tempdb go create table #t1 ( id int not

SpringBoot之事务处理机制

非 Y 不嫁゛ 提交于 2019-11-30 22:55:30
一、 Spring的事务机制 所有的数据访问技术都有事务处理机制,这些技术提供了 API用来开启事务、提交事务来完成数据操作,或者在发生错误的时候回滚数据。 而 Spring的事务机制是用统一的机制来处理不同数据访问技术的事务处理。Spring的事务机制提供了一个PlatformTransactionManager接口,不同的数据访问技术的事务使用不同的接口实现: 在程序中定义事务管理器的代码如下: @Bean public PlatformTransactionManager transactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setDataSource(dataSource()); return transactionManager; } 二、声明式事务 Spring支持声明式事务,即使用注解来选择需要使用事务的方法,它使用@Transactional注解在方法上表明该方法需要事务支持。 @Transactional public void saveSomething(Long id, String name) { //数据库操作 } 在此处需要特别注意的是,此 @Transactional注解来自org

Java Spring 事务回滚详解

十年热恋 提交于 2019-11-30 19:33:43
这篇文章主要介绍 java Spring事务回滚 spring 事务回滚 1、遇到的问题   当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下: public method() { Dao1.save(Person1); Dao1.save(Person2); Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数据库中 Dao1.save(Person2); }   期待的情况:发生错误之前的 所有数据库保存操作都回滚 ,即不保存   正常情况:前面的数据库操作会被执行,而发生数据库操作错误开始及之后的所有的数据保存操作都将失败。这样子应该都不是我们要的结果吧。   当遇到这种情况,我们就可以使用 Spring的事务解决这个问题。 2、异常的一些基本知识 1) 异常的架构   异常的继承结构: Throwable为基类,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception。Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。 2)Error异常    Error表示程序在运行期间出现了十分严重、不可恢复的错误,在这种情况下应用程序只能中止运行

mysql并发控制——数据多版本

北城余情 提交于 2019-11-30 16:52:15
内容提取自 58沈剑公众号:架构师之路 1、共享锁和排他锁 因为普通锁不能并发,所以出现了共享和排它锁 共享锁(Share Locks,记为S锁),读取数据时加S锁 排他锁(exclusive Locks)修改数据时加X锁 兼容互斥表 S X S 兼容 互斥 X 互斥 互斥 这种情况下,如果写数据的任务没有完成,数据不能被任务读取的。这回阻塞读取任务。 画外音:对应到数据库,可以理解为,写事务没有提交,读取相关数据的select会被阻塞 2、数据多版本 核心原理: 1)写任务发生时,将数据克隆一份,以版本号区分 2)写任务操作新克隆的数据,直至提交;(提交时覆盖原来版本?提交方式有待思考) 3)并发读任务可以继续读取旧版本的数据,不至于阻塞 3、redo,undo,回滚段 在进一步介绍InnoDB如何使用“读取旧版本数据”极大提高任务的并发度之前,有必要先介绍下redo日志,undo日志,回滚段(rollback segment)。 为什么要有redo 日志? 数据库事务提交后,必须将更新后的数据刷到磁盘上,以保证ACID特性。磁盘 随机写 性能较低,如果每次都刷盘,会极大影响数据库的吞吐量。 优化方式是,将修改行为先写到redo日志里(此时变成了 顺序写 ),再定期将数据刷到磁盘上,这样能极大提高性能。 画外音:这里的架构设计方法是, 随机写优化为顺序写 ,思路更重要。

一些常见的MySQL配置

耗尽温柔 提交于 2019-11-30 15:05:22
目录 配置 参考 配置 [mysqld] port = 3306 socket = /mysql/log/mysql_3306.sock # mysql的目录(即mysql的文件所在目录) # basedir = /mysql/mysql_basedir # mysql中存放数据的目录 datadir = /mysql/data # mysql的日志目录 log_error = /mysql/log/error.log # pid文件所在目录 pid-file = /mysql/log/mysql_3306.pid # mysqld程序在启动后将在给定UNIX/Linux账户下执行; mysqld必须从root账户启动才能在启动后切换到另一个账户下执行; mysqld_safe脚本将默认使用–user=mysql选项来启动mysqld程序。 # user = root # 配置mysql绑定地址,配置为0.0.0.0可以使该机器所有IP访问 bind-address = 0.0.0.0 # mysql标记,一般使用IP最后一位,不可重复 server-id = 1 # 打开binlog log-bin = mysql-bin # binlog的前缀名 log-bin-index = master-bin.index # 更改服务器的校验规则,默认为utf8mb4_general

08.Django基础六之ORM中的锁和事务

烈酒焚心 提交于 2019-11-30 14:22:18
一 锁    行级锁     select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节。     返回一个锁住行直到事务结束的查询集,如果数据库支持,它将生成一个 SELECT ... FOR UPDATE 语句。     举个例子: entries = Entry.objects.select_for_update().filter(author=request.user) #加互斥锁,由于mysql在查询时自动加的是共享锁,所以我们可以手动加上互斥锁。create、update、delete操作时,mysql自动加行级互斥锁     所有匹配的行将被锁定,直到事务结束。这意味着可以通过锁防止数据被其它事务修改。     一般情况下如果其他事务锁定了相关行,那么本查询将被阻塞,直到锁被释放。 如果这不想要使查询阻塞的话,使用select_for_update(nowait=True)。 如果其它事务持有冲突的锁,互斥锁, 那么查询将引发 DatabaseError 异常。你也可以使用select_for_update(skip_locked=True)忽略锁定的行。 nowait和  skip_locked是互斥的,同时设置会导致ValueError。     目前

@Transactional注解使用解析

狂风中的少年 提交于 2019-11-30 11:59:00
当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。 在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。 在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚 来源: https://blog.csdn.net/yyyyyysssssshhhhhh/article/details/101350078

redo log和undo log、事务

徘徊边缘 提交于 2019-11-30 05:40:43
redo log和undo log、事务 redo log 如果系统突然崩溃,一些在缓存中的修改还没来的及同步到磁盘中,用redo log就可以恢复这些修改,Redo log就是记录这些修改的日志。这些对页面的修改有一些是原子操作,比如有些插入伴随着页面分裂和页的新建(悲观插入),此时这些分裂和修改必须一气呵成,这样的操作叫mini-transition,一条语句可能包含多个mini-transition,而一个又包含多个redo日志,这种原子性用一个特殊位来标记,在恢复时读到标志位才恢复之前的内容,否则放弃之前的日志。每次的redo日志也是存到buffer pool中,选择合适的时机刷新到磁盘,可以选择事务提交时同步到磁盘或写入缓存。 (LSN:记录的一个字段,一个redo日志对应的编号,一个页的LSN越大说明刚刚修改过) undo log 为了事务回滚而记录的日志信息,undo日志有几种类型,插入数据、删除数据、更新数据都会产生不同的undo log,记录有一个roll_pointer的指针指向它的undo log,所有关于这条记录的undo log都连成一条链表,称为版本链,根据undo log的事务ID来判断是哪个事务中修改了该记录,事务回滚时找到对应事务ID的undo log恢复数据除此之外,undo log还可以用来维护MVCC(多版本并发控制)。

oracle之回顾二

佐手、 提交于 2019-11-30 04:36:29
1. 事务 (Transaction) 事务(Transaction)是一个操作序列。这些操作要么都做, 要么都不做, 是一个不可分割的工作单元, 是数据库环境中的最小工作单元。 1 . 1 事务的特性 (ACID) 1 . 1 . 1 Atomicity(原子性) 原子性是指事务包含的所有操作要么全部成功 , 要么全部失败回滚, 因此事务的操作如果成功就必须要完全应用到数据库, 如果操作失败则不能对数据库有任何影响. 1 . 1 . 2 Consistency(一致性) 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态 , 也就是说一个事务执行之前和执行之后都必须处于一致性状态. 1 . 1 . 3 Isolation(隔离性) 隔离性是当多个用户并发访问数据库时 , 比如操作同一张表时, 数据库为每一个用户开启的事务, 不能被其他事务的操作所干扰, 多个并发事务之间要相互隔离. 1 . 1 . 4 Durability(持久性) 持久性是指一个事务一旦被提交了 , 那么对数据库中的数据的改变就是永久性的, 即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作. 1 . 2 事务的提交和回滚 a) 提交 , 在确保事务执行成功时 , 应该将事务进行提交 . 提交后 , 数据被永久保存 , 不能进行回滚 . commit; b) 回滚 , 当事务执行出现故障时

驰骋工作流程底层的API开发接口-重要的

China☆狼群 提交于 2019-11-30 04:11:28
开发API URL 调用接口 | 代码开发API | FEE 开发API 登录与门户API 首先要进行代码集成与组织机构的集成 其次在自己的系统登录界面,登录成功后要执行ccbpm的框架登录。 所谓的登录就是调用ccbpm的登录接口,如左边的代码所示。 // 如下代码需要写入您的系统校验密码与用户名之后。 string userNo = "zhangsan"; BP.WF. Dev2Interface .Port_Login(userNo); 菜单API 发起:一个操作员可以发起的工作 待办:等待处理的工作。 在途:我参与的,但是这条流程还没有结束的流程。 抄送:不需要我处理,但是需要我知晓的工作。 发起: //获得指定人员的可以发起的流程列表,调用这个接口返回一个datatable, 可以参考一个demo实现发起列表的输出。 System.Data. DataTable dtStart = BP.WF. Dev2Interface .DB_GenerCanStartFlowsOfDataTable( "zhangsan" ); 待办: //获得指定人员的待办,调用这个接口返回一个datatable, 可以参考一个demo实现发起列表的输出。 DataTable dtTodolist = BP.WF.Dev2Interface.DB_GenerEmpWorksOfDataTable