事务

分布式事务

北战南征 提交于 2020-01-20 00:54:21
本地事务 事务Transaction由一组SQL组成,具有四个ACID特性 ACID Atomicity 原子性 构成事务的一组SQL,要么全部生效,要么全不生效,不会出现部分生效的情况 Consistency 一致性 数据库经过事务操作后从一种状态转变为另一个状态。可以说原子性是从行为上描述,而一致性是从结果上描述 isolation 隔离性 事务操作的数据对象 相对于 其他事务操作的数据对象相互隔离,互不影响 durability 持久性 事务提交后,其结果就是永久性的,即使发生宕机(非磁盘损坏) 事务实现 对于MySQL数据库(InnoDB存储引擎)而言,隔离性是通过不同粒度的锁机制来实现事务间的隔离;原子性、一致性和持久性通过redo log 重做日志和undo log回滚日志来保证的。 redo log 当数据库对数据做修改的时候,需要把数据页从磁盘读到buffer pool中,然后在buffer pool中进行修改,那么这个时候buffer pool中的数据页就与磁盘上的数据页内容不一致,称buffer pool的数据页为dirty page 脏数据,如果这个时候发生非正常的DB服务重启,那么这些数据还没在内存,并没有同步到磁盘文件中(注意,同步到磁盘文件是个随机IO),也就是会发生数据丢失,如果这个时候,能够在有一个文件,当buffer pool 中的data

性能测试监控关键指标

流过昼夜 提交于 2020-01-20 00:06:19
性能测试监控关键指标: Ø 资源指标 CPU使用率:指用户进程与系统进程消耗的CPU时间百分比,长时间情况下,一般可接受上限不超过85%。 内存利用率:内存利用率=(1-空闲内存/总内存大小)*100%,一般至少有10%可用内存,内存使用率可接受上限为85%。 磁盘I/O: 磁盘主要用于存取数据,因此当说到IO操作的时候,就会存在两种相对应的操作,存数据的时候对应的是写IO操作,取数据的时候对应的是是读IO操作,一般使用% Disk Time(磁盘用于读写操作所占用的时间百分比)度量磁盘读写性能。 网络带宽:一般使用计数器Bytes Total/sec来度量,Bytes Total/sec表示为发送和接收字节的速率,包括帧字符在内。判断网络连接速度是否是瓶颈,可以用该计数器的值和目前网络的带宽比较。 Ø 系统指标: 并发用户数:某一物理时刻同时向系统提交请求的用户数。 在线用户数:某段时间内访问系统的用户数,这些用户并不一定同时向系统提交请求。 平均响应时间:系统处理事务的响应时间的平均值。事务的响应时间是从客户端提交访问请求到客户端接收到服务器响应所消耗的时间。对于系统快速响应类页面,一般响应时间为3秒左右。 事务成功率:性能测试中,定义事务用于度量一个或者多个业务流程的性能指标,如用户登录、保存订单、提交订单操作均可定义为事务。单位时间内系统可以成功完成多少个定义的事务

数据库—事务—隔离级别

空扰寡人 提交于 2020-01-19 17:56:50
隔离级别 数据库事务的四个基本特征(ACID) 原子性(Atomic):事务中包含的操作被看做一个整体的业务单元,这个业务单元中的操作,要么全部成功,要么全部失败。 一致性(Consisitency):事务在完成时,必须使所有的数据都保持一致状态,在数据库中所有的修改都基于事务,保证了数据的完整性。例,A账户有一千元,B账户有一千元,A+B = 2000元, A向B转账100元,此时A有900元,B有1100元,A+B依然是2000元。 隔离性(Isolation) :当多个线程访问同一数据,此时数据库同样的数据就会在各个不同的事务中访问,这样会产生丢失更新。例,事务A读取了事务B尚未提交的数据。为了压制丢失更新的产生,数据库定义了隔离级别的概念。 持久性(Durability):事务结束后,所有的数据都会固化到一个地方,如保存到磁盘当中,即时断电重启也可以提供给应用程序访问。 丢失更新类型 这四个特性,除了隔离性都比较好理解。我们再举例说明下,在多个事务同时操作数据的情况下,会引发丢失更新的场景。例如,电商有一种商品,在疯狂抢购,此时会出现多个事务同时访问商品库存的情景,这样就会产生丢失更新。一般而言,存在两种类型的丢失更新。 假设某种商品A库存数量为100,抢购时,每个用户仅允许抢购一件商品,name在抢购过程中就可能出现如下场景: 可以看到,T5时刻事务1回滚

PostgreSQL约束延迟判断

两盒软妹~` 提交于 2020-01-19 12:03:16
当我们对一张表上的数据进行操作时,如果该表上有约束存在,那么约束是在什么时候生效的呢? 例如我们在进行数据迁移的时候就会考虑的这个问题,有的迁移工具在迁移的时候必须得将表约束和数据分开迁移,否则会出现数据无法导入的情况,这就是因为约束不能延迟导致的。 那么pg中对于约束的延判有什么原则呢? 1、数据导出时,约束通常是在数据都写入后再创建。避免先创建约束后倒入失败。 2、在使用过程中,PG提供了延迟检测约束的功能: 2.1、允许约束延判,(建表、建约束时可以指定,后续也可以修改) 2.2、设置延判规则,在语句结束还是在事务结束时判断约束。可以通过修改约束定义,或者直接在事务中设置规则。 涉及到以下几个参数: DEFERRABLE/NOT DEFERRABLE 这两个选项控制了该约束是否能被延迟。一个不可延迟的约束将在每一次命令后立刻被检查,可延迟约束的检查将被推迟到事务结束时进行。 INITIALLY IMMEDIATE/INITIALLY DEFERRED 延迟判断规则,如果该约束是INITIALLY IMMEDIATE,它会在每一个语句之后被检查。这是默认值。如果该约束是INITIALLY DEFERRED,它只会在事务结束时被检查。 我们可以在事务中设置延迟规则: SET CONSTRAINTS { ALL | name [ , . . . ] } { DEFERRED |

第二周spring内容

≯℡__Kan透↙ 提交于 2020-01-19 04:42:32
spring通过ioc创建bean的三种方式 一、使用自动装配创建bean Spring主要从两个角度来实现自动化装配:①组件扫描;②自动装配。组件扫描指的是Spring会自动扫描指定包及其子包下的所有bean,并将其放入spring容器中进行管理,而自动装配则是指对于有相互依赖关系的bean,Spring会将其自动装配到目标bean中,如将repository层的bean自动装配到service层中。 自动装配的方式创建bean主要是使用一个被专门用来当做配置的接口(或类)来实现的。配置接口上主要使用两个注解:@Configuration和@ComponentScan。@Configuration来标注该接口是用于定义配置的,而@ComponentScan则是用于指定扫描的bean的文件夹的,默认情况下Spring会扫描该配置接口所在包及其子包下的所有bean。 这样Spring就可以自动创建一个SgtPeppers的实例,并且将其放到Spring容器中进行管理,另外我们也可以使用@Named注解来创建一个bean。 上面只是讲了如何创建一个bean,而自动装配还有另一方面的概念:依赖注入。其是指Spring会将一个bean所依赖的bean自动装配进来。依赖注入是通过@Autowired或@Resource来实现的,当一个bean需要另一个bean作为其属性的时候

面试题总结

感情迁移 提交于 2020-01-19 00:29:45
1 数据库 1.1 内连接、外连接区别? 内连接:只查询满足连接条件的数据,连接条件以外的数据被过滤。 集合:A交B SQL语句: select a.c1,b.c2 from A a,B b where a.pk=b.fk select a.c1,b.c2 from A a join B b on a.pk=b.fk 外连接:不满足连接条件数据,连接条件以外的数据也查询出来。 外连接分为左外连接、右外连接和全外连接。 左外连接:A select a.c1,b.c2 from A a left join B b on a.pk=b.fk select a.c1,b.c2 from A a right join B b on a.pk=b.fk 1.2 索引的作用和缺点 作用:加速字段的检索效率,快速定位; 缺点:对表中数据进行增删改操作时,需要同时修改索引数据,降低效率;索引本身占用空间。 1.3 什么是事务 事务将一组SQL语句作为一个整体,所有SQL语句操作成功,事务整体蔡成功;任何一个语句操作失败那么整个操作失败,回滚到操作前状态。 事务具有四个特性:ACID。即原子性、一致性、隔离性和持久性。 1.4 事务的隔离级别 多个事务并行操作时,可能引发数据访问冲突,包括:藏读、不可重复读和幻读; 为了避免数据访问冲突,需要对并行的事务进行隔离,而完全隔离优惠降低操作效率。

SQL server 事务实例

本秂侑毒 提交于 2020-01-18 23:40:13
简单的SQLserver事务实例: 执行SQL 组合操作A、操作B,只有AB都执行成功时才提交事务,否则回滚事务。 测试数据表: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 --1.数据表A CREATE TABLE A( A1 VARCHAR (10) ,A2 VARCHAR (10) ); INSERT INTO A(A1,A2) VALUES ( '00001' , 'soulsjie' ); --2.数据表B CREATE TABLE B( B1 VARCHAR (10) ,B2 VARCHAR (100) ); INSERT INTO B(B1,B2) VALUES ( '6666' , 'b0001' ); INSERT INTO B(B1,B2) VALUES ( '666' , 'b0002' ); 事务实例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 --SQL server事务 BEGIN TRAN UpdateAandB --创建事务 DECLARE @AJIEGUO INT ,@BJIEGUO INT UPDATE A SET A1= '12345678910' ; --操作A SET @AJIEGUO=@@ERROR; --操作A的执行状态码,0表示执行成功 UPDATE B SET B2=

MySQL事务的4种特性以及事务隔离级别

守給你的承諾、 提交于 2020-01-18 06:58:04
事务的基本特性 1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。    2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。    3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。    4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。 事务的并发问题 1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据   2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。   3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。   小结

分布式事务

岁酱吖の 提交于 2020-01-18 06:57:15
TCC 基于RM本地事务来实现 https://github.com/liuyangming/ByteTCC 源码分析: 1.1.1. Spring Cloud <dependency> <groupId>org.bytesoft</groupId> <artifactId>bytetcc-supports-springcloud</artifactId> <version>0.5.7</version> </dependency> 1.1.2. dubbo <dependency> <groupId>org.bytesoft</groupId> <artifactId>bytetcc-supports-dubbo</artifactId> <version>0.5.7</version> </dependency> 1.2 Compose a business service @Service("accountService") @Compensable( interfaceClass = IAccountService.class , confirmableKey = "accountServiceConfirm" , cancellableKey = "accountServiceCancel" ) public class AccountServiceImpl

大规模分布式存储系统原理解析与架构实战-读书笔记3-单机存储系统(2)

好久不见. 提交于 2020-01-18 04:53:34
大规模分布式存储系统原理解析与架构实战-读书笔记3-单机存储系统(2) 数据模型主要分为三类:文件,关系以及KV。 文件模型 文件系统以目录树的形式呈现。 对象模型和文件模型比较类似,用于存储视频,图片,文档等二进制数据块,典型的系统包括Amazon Simple Storage(S3),Taobao File System(TFS) 键值模型 Key-value模型简单,使用的场景有限,NoSQL中使用比较广泛的是表格模型,其弱化了关系模型中的多表关联,支持基于单表的简单操作,典型的是Google的BigTable和其Java实现的HBase SQL和NoSQL 事务:关系模型要求满足ACID,要么全部成功,要么全部失败。在分布式系统中,如果多个操作属于不同的服务器,满足原子性需要两阶段提交协议,而这个协议的性能很低,且不能容忍服务器故障,很难应用的海量数据场景。 并发控制 数据库锁:允许加多个读锁,但只能有一个写锁。解决死锁的办法有两个:一个是给事务加超时时间,另一个是死锁检测。 写时复制:因为读操作远远多于写操作,写时复制(Copy-On-Write)读操作不加锁,极大提高性能。 1 拷贝:将从叶子节点到根节点路径上的所有点拷贝出来 2 修改:对拷贝的节点执行修改。 3 提交:原子地切换根节点的指针,使之指向新的根节点。 多个写操作之间是互斥的,同一时刻只允许一个写操作