mysql事务

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手册

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

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

MySQL事务的隔离级别

老子叫甜甜 提交于 2020-01-26 23:03:11
如果不考虑隔离性,引发一些安全问题 隔离性:一个事务的执行,不应该受到其他事务的干扰。 如果不考虑隔离性(一个事务执行受到其他的事务的干扰),引发一些安全问题,主要体现在读取数据上: 脏读:一个事务读到了另一个事务未提交的数据,导致查询结果不一致 不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致多次查询结果不一致。 虚读/幻读:一个事务读到了另一个事务已经提交的insert的数据,导致多次查询结果不一致。 解决这些安全性问题: 设置事务的隔离级别: read uncommitted :脏读,不可重复读,虚读都有可能发生 read committed :避免脏读。但是不可重复读和虚读是有可能发生 repeatable read :避免脏读和不可重复读,但是虚读有可能发生。 serializable :避免脏读,不可重复读,虚读。 来源: CSDN 作者: 学亮编程手记 链接: https://blog.csdn.net/a772304419/article/details/104089094

my39_InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析

自古美人都是妖i 提交于 2020-01-26 21:22:16
MySQL InnoDB支持三种行锁定方式: 行锁(Record Lock):锁直接加在索引记录上面,锁住的是key。 间隙锁(Gap Lock): 锁定索引记录间隙,确保索引记录的间隙不变。间隙锁是针对事务隔离级别为可重复读或以上级别而已的。 Next-Key Lock :行锁和间隙锁组合起来就叫Next-Key Lock。 默认情况下,InnoDB工作在可重复读隔离级别下,并且会以Next-Key Lock的方式对数据行进行加锁,这样可以有效防止幻读的发生。 Next-Key Lock是行锁和间隙锁的组合,当InnoDB扫描索引记录的时候,会首先对索引记录加上行锁(Record Lock),再对索引记录两 边的间隙加上间隙锁(Gap Lock)。加上间隙锁之后,其他事务就不能在这个间隙修改或者插入记录。 Gap Lock在InnoDB的唯一作用就是防止其他事务的插入操作,以此防止幻读的发生。 行锁(Record Lock) 行锁锁定的是索引记录,而不是行数据,也就是说锁定的是key。 间隙锁(Gap Lock) 例如: create table test(id int,v1 int,v2 int,primary key(id),key `idx_v1`(`v1`))Engine=InnoDB DEFAULT CHARSET=UTF8; insert into test

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: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

对事务的特性ACID的理解

家住魔仙堡 提交于 2020-01-26 17:40:57
对事务的特性ACID的理解 数据库的事务必须具备ACID特性,ACID是指 Atomicity(原子性)、Consistensy(一致性)、Isolation(隔离型)和Durability(持久性)的英文缩写。 1、 原子性(Atomicity ) 事务包装的一组sql ,要么都执行成功,要么都失败。这些操作是不可分割的。 2、 一致性(Consistency ) 数据库的数据状态是一致的。 事务的成功与失败,最终数据库的数据都是符合实际生活的业务逻辑。一致性绝大多数依赖业务逻辑和原子性。 3、 持久性:( Durability ) 事务成功提交之后,对于数据库的改变是永久的。哪怕数据库发生异常,重启之后数据亦然存在。 4、 隔离性(Isolation ) 一个事务的成功或者失败对于其他的事务是没有影响。2 个事务应该相互独立。 事务的隔离级别 如果不考虑事务的隔离性,由于事务的并发,将会出现以下问题: 1、脏读 -- 最严重,杜绝发生 2、不可重复读 3、幻读(虚读) 脏读:指一个事务读取了另外一个事务 未提交的数据。 一个事务读取了另一个事务没有提交的数据,非常严重。应当尽量避免脏读。 不可重复读:在一个事务内多次读取表中的数据,多次读取的结果不同。 幻读(虚读) 隔离级别:如何解决问题 l 数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况。 read