数据库事务

MySQL数据库(六)—— 事务

孤人 提交于 2020-01-28 14:03:54
一、事务的基本特征 1. 概念:如果一个包含多个步骤的业务操作,被事务管理,这些操作要么同时成功,要么同时失败。 事务执行是一个整体,所有的SQL语句都必须执行成功。如果其中有一条SQL语句出现异常,则所有的SQL语句都要回滚,整个业务执行失败。 2. 操作: (1) 开启事务:start transaction (2) 回滚:rollback (3) 提交:commit 3.MySQL数据库中事务默认自动提交 事务提交的两种方式: 第一种方式:自动提交 MySQL就是自动提交的。 一条DML语句会自动提交一次事务。 第二种方式:手动提交 Oracle数据库默认是手动提交事务的。 需要先开启事务,在提交。 4.修改事务的默认提交方式: 查看事务的默认提交方式: SQL语句:select @@autocommit; 结果:1代表自动提交;0代表手动提交 修改事务默认提交方式SQL语句为:set @@autocommit = 0; 这时写了DML语句,不写commit是不会生效的。 二、事务的四大特征(ACID) 原子性(Atomicity):事务是一个不可分割的最小单元,要么全部成功提交,要么全部失败回滚。失败回滚的事务,将不能对事物有任何影响。 一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态

数据库MySQL-InnoDB参数配置

佐手、 提交于 2020-01-28 03:03:23
3、配置InnoDB的几个变量 1、innodb_buffer_pool_size 对于InnoDB表来说, innodb_buffer_pool_size 的作用就相当于key_buffer_size对于MyISAM表的作用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,最大可以把该值设置成物理内存的80%。 根据MySQL手册,对于2G内存的机器,推荐值是1G(50%)。 show status like 'innodb%'; 2、innodb_flush_log_at_trx_commit 主要控制了innodb将log buffer中的数据写入日志文件并flush磁盘的时间点,取值分别为0、1、2三个。0,表示当事务提交时,不做日志写入操作,而是每秒钟将log buffer中的数据写入日志文件并flush磁盘一次;1,则在每秒钟或是每次事物的提交都会引起日志文件写入、flush磁盘的操作,确保了事务的ACID;设置为2,每次事务提交引起写入日志文件的动作,但每秒钟完成一次flush磁盘操作。 实际测试发现,该值对插入数据的速度影响非常大,设置为2时插入10000条记录只需要2秒,设置为0时只需要1秒,而设置为1时则需要229秒。因此,MySQL手册也建议尽量将插入操作合并成一个事务,这样可以大幅提高速度。 根据MySQL手册

简单聊聊事务补偿机制

こ雲淡風輕ζ 提交于 2020-01-28 02:25:05
假设有如下的业务流程,用户1给用户2转账100元: 转账服务需要执行如下操作: 第1步. 在数据库连接1上执行:update 用户表 set (用户1的余额) = (用户1的余额)- 100; 第2步. 在数据库连接2上执行:update 用户表 set (用户2的余额) = (用户2的余额)+ 100; 可能的问题: 1:第1步操作过程中,数据库1挂了,转账服务无法得知对用户1的扣款操作是否成功; 2:第1步操作成功,第2步操作失败,转账服务回滚第1步的操作时,数据库1挂了; 3:第1步操作成功,第2步操作过程中,数据库2挂了,转账服务无法得知是否成功给用户2加了钱; 基于上面的问题,产生了如下的数据库设计: 转账流程变成了如下步骤: 第1步: 转账服务生成一个事务号,全局唯一; 第2步:转账服务在数据库1上执行事务: 开始事务: update 用户表 set (用户1的余额) = (用户1的余额)- 100; insert 事务表 (事务号,成功) 结束事务: 第3步:转账服务在数据库2上执行事务: 开始事务: update 用户表 set (用户2的余额) = (用户2的余额)+ 100; insert 事务表 (事务号,成功) 结束事务: 这样做的好处 当操作用户1的账户失败时,转账服务可以通过再次查询数据库1的事务表来判断操作是否成功; 当操作用户2的账户失败时

MySql事务

▼魔方 西西 提交于 2020-01-28 01:29:04
当一个业务逻辑需要多个sql完成时,如果其中某条sql语句出错,则希望整个操作都退回 使用事务可以完成退回的功能,保证业务逻辑的正确性 事务四大特性(简称ACID) 原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的 持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障 要求:表的类型必须是innodb或bdb类型,才可以对此表使用事务 使用事务的情况:当数据被修改时,包括insert、update、delete 查看表的类型(查询通过表的创建语句) show create table students; 修改表的类型 alter table '表名' engine=innodb; 事务语句 开启begin; 提交commit; 回滚rollback; begin与commit之间,所有对库修改的语句都临时在内存中保存。只要没执行commit。可以随时通过rollback回滚。 执行commit后,修改的内容固化到硬盘中。 示例1 步骤1:打开两个终端,连接mysql

关于微服务(六)

荒凉一梦 提交于 2020-01-28 00:46:24
业务技术架构 架构实现 总的来说我的通用架构还是以三层架构为基础进行演变的,在经典的三层架构中,最上层的是controller,中间是service,下层是dao。 在微服务的架构中,最上层是网关层,controller只是网关的一种,中间是业务层,service只是业务层的入口,最下层是基础层,dao只是基础层中的数据存储组件。 一.网关层 网关层本质上是对不同的网络协议的请求进行处理,比如HTTP协议,TCP协议,当然,也可以对其他协议进行处理。具体见下图: 1.HTTP请求 一般来自PC端和APP端的请求都是基于HTTP协议的,对于处理HTTP请求的方案,业内已经非常成熟了。首先,tomcat容器本身已经把HTTP请求处理的复杂性封装掉了, 其次,spring mvc对请求处理提供了RESTful风格的编码方式,大大降低了开发的复杂度。我们要做的就是对controller按照业务领域划分,比如按照订单、会员去划分大的领域,里面的各种方法就是这个领域内的操作。 这里的controller就是统一网关处理层,对于每个controller的方法只做三件事,第一,将请求参数解析出来并组装成内部参数,第二调用下层服务执行业务逻辑,第三组装返回结果, 对于异常情况,需要记录异常堆栈日志并转换错误码,堆栈信息不要暴露到调用方。 2.TCP请求 对于处理TCP请求的方案,业内也已经很成熟了

MySQL 事务与锁详解

吃可爱长大的小学妹 提交于 2020-01-27 17:15:22
1 什么是数据库的事务? 1.1 事务的典型场景 比如下单,会操作订单表,资金表,物流表等等,这个时候我们需要让这些操作都 在一个事务里面完成。在金融的系统里面事务配置是很常见的,比如行内转账的这种操 作,如果我们把它简单地理解为一个账户的余额增加,另一个账户的余额减少的情况(当 然实际上要比这复杂),那么这两个动作一定是同时成功或者同时失败的。 1.2 事务的定义 维基百科的定义:事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由 一个有限的数据库操作序列构成。 这里面有两个关键点, 第一个,它是数据库最小的工作单元,是不可以再分的。 第二个,它可能包含了一个或者一系列的 DML 语句,包括 insert delete update。 1.3 哪些存储引擎支持事务 InnoDB 支持事务,这个也是它成为默认的存储引擎的一个重要原因: https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html 另一个是 NDB。 1.4 事务的四大特性 第一个,原子性,Atomicity,也就是我们刚才说的不可再分,也就意味着我们对数 据库的一系列的操作,要么都是成功,要么都是失败,不可能出现部分成功或者部分失 败的情况,以刚才提到的转账的场景为例,一个账户的余额减少,对应一个账户的增加, 这两个一定是同时成功或者同时失败的。

MySQL数据库事务的特性

核能气质少年 提交于 2020-01-26 23:14:51
原子性 原子性:事务的不可分割,组成事务的各个逻辑单元不可分割。 一致性 一致性:事务执行的前后,数据完整性保持一致。 隔离性 隔离性:事务执行不应该受到其他事务的干扰。 持久性 持久性:事务一旦结束,数据就持久化到数据库中。 来源: CSDN 作者: 学亮编程手记 链接: https://blog.csdn.net/a772304419/article/details/104089087

select for update引发死锁分析

一世执手 提交于 2020-01-26 20:22:48
本文针对MySQL InnoDB中在Repeatable Read的隔离级别下使用select for update可能引发的死锁问题进行分析。 1. 业务案例 业务中需要对各种类型的实体进行编号,例如对于x类实体的编号可能是x201712120001,x201712120002,x201712120003类似于这样。可以观察到这类编号有两个部分组成:x+日期作为前缀,以及流水号(这里是四位的流水号)。 如果用数据库表实现一个能够分配流水号的需求,无外乎就可以建立一个类似于下面的表: CREATE TABLE number ( prefix VARCHAR(20) NOT NULL DEFAULT '' COMMENT '前缀码', value BIGINT NOT NULL DEFAULT 0 COMMENT '流水号', UNIQUE KEY uk_prefix(prefix) ); 那么在业务层,根据业务规则得到编号的前缀比如x20171212,接下去就可以在代码中起事务,用select for update进行如下的控制。 @Transactional long acquire(String prefix) { SerialNumber current = dao.selectAndLock(prefix); if (current == null) { dao

事务隔离级别

无人久伴 提交于 2020-01-26 20:07:45
1、什么是事务:    事务是逻辑上的一组操作,要么都执行,要么都不执行。   例如:银行转账,A转账1000元给B,这个转账就涉及到两个操作:将A余额减去1000元,将B余额加上1000元。但是外一在转账的过程中银行的系统奔溃,导致A只减了,B没有加,这样就出错了。事务就是要保证这两个操作,要么都成功,要么都失败。 2、事物的特性: (1)原子性:原子性是指一个事务必须被视为一个不可分割的最小工作单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功,事务中如果有任何一个 (2)一致性: 在一个事务执行之前和执行之后数据库都必须处于一致性状态。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。 (3)隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的; (4)持久性:一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。 来源: https://www.cnblogs.com/guoyu1/p/12234664.html

锁模块

筅森魡賤 提交于 2020-01-26 20:06:34
锁模块的常见问题 1、MyISAM和InnoDB关于锁方面的区别是什么? 2、数据库事务的四大特性? 3、事务隔离级别以及各级别下的并发访问问题? 4、InnoDB可重复读隔离级别下如何避免幻读? 5、RC、RR级别下的InnoDB的非阻塞读如何实现? 1、MyISAM和InnoDB关于锁方面的区别是什么? MyISAM默认用的是表级锁,不支持行级锁 InnoDB默认用的是行级锁,也支持表级锁 2、数据库事务的四大特性? ACID 原子性(Atomic) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability) 3、事务隔离级别以及各级别下的并发访问问题? 事务并发访问引起的问题以及如何避免 1) 更新丢失----mysql所有事务隔离级别在数据库层面上均可避免 如下图,对同一个账号进行操作 2) 脏读----READ-COMMITED 事务隔离级别以上可避免 查询事务的隔离级别 SELECT @@tx_isolation; 设置事务的隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 3) 不可重复读----REPEATABLE-READ 事务隔离级别以上可避免 4)幻读----SERIALIZABLE 事务隔离级别可避免 来源: https://www.cnblogs