小黑黑的碎碎念 哎,最近有点忙,备考复习不利,明天还要搬家,好难啊!! 本想着这周鸽了,但是想想还是不行,爬起来,更新一下,周更可不能断.偷懒一下,修改一下之前的一篇历史文章,重新发布一下. P0 事故:余额多扣! 这是一个真实的生产事件,事件起因如下: 现有一个交易系统,每次产生交易都会更新相应账户的余额,出账扣减余额,入账增加余额. 为了保证资金安全,余额发生扣减时,需要比较现有余额与扣减金额大小,若扣减金额大于现有余额,扣减余额不足,扣减失败. 账户表(省去其他字段)结构如下: CREAT…
mysql可重复读现象及原理分析 InnoDB---可重复读隔离级别的底层实现原理 概念 可重复读的实现 Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到其他事务对已有记录的更新(即晚于本事务开始的),并且,该事务不要求与其他事务是“可串行化”的. 这句话的核心,是“但是不能看到其他事务对已有记录的更新”,那么RR隔离级别是怎么保证这一点的呢? 实现原理 使用MVCC(多版本并…
概念 Repeatable Read(可重复读):即:事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容. 实现原理(MVCC [ 多版本并发控制 ]) InnoDB在每行记录后面保存两个隐藏的列来,分别保存了这个行的创建时间和行的删除时间.这里存储的并不是实际的时间值,而是系统版本号,当数据被修改时,版本号加1 在读取事务开始时,系统会给当前读事务一个版本号,事务会读取版本号<=当前版本号的数据 此时如果其他写事务修改了这条数据,那么这条数…
引言 之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了.但是对于幻读,我发现在可重复读的隔离级别下没有出现,当时想到难道是MySQL对幻读做了什么处理? 测试: 创建一张测试用的表dept: CREATE TABLE `dept` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT…
之前在深入了解数据库理论的时候,了解到事务的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了. 但是对于幻读,我发现在可重复读的隔离级别下没有出现,当时想到难道是MySQL对幻读做了什么处理? 测试: 创建一张测试用的表dept: CREATE TABLE `dept` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NU…
引言 之前在深入了解数据库理论的时候,了解到事务的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了. 但是对于幻读,我发现在可重复读的隔离级别下没有出现,当时想到难道是MySQL对幻读做了什么处理? 测试: 创建一张测试用的表dept: CREATETABLE`dept`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(20)DEFAULTNULL,PRIMAR…
Server version:         5.6.21-log MySQL Community Server (GPL) 前提提要: 我们知道MySQL的RR(repeatable read)隔离级别下,事务无法看到正在活跃的事务所做的操作包括提交后的. 一般手动开启事务的命令是begin或start transaction:我以前的理解是一旦执行这条语句就已经开启了事务,也就是事务id已经生成(可用于MVCC版本比较).如果事务A和事务B一起执行begin,事务A的所有操作的提交事务B都…
原文地址:http://blog.itpub.net/29254281/viewspace-1398273/ MySQL选用可重复读隔离级别之前一定要想到的事情.间隙锁 MySQL在使用之前有三个务必要知道..(随着了解的深入这个极有可能再增加..)1.DDL会引起metadata lock,导致请求连环阻塞,甚至是查询请求.http://blog.itpub.net/29254281/viewspace-1383193/ 2.MySQLDump和XtraBackup的flush table命令…
1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约束没有被破坏 持久性:事务的提交结果,将持久保存在数据库中 2.事务并发会产生什么问题 1)第一类丢失更新:在没有事务隔离的情况下,两个事务都同时更新一行数据,但是第二个事务却中途失败退出, 导致对数据的两个修改都失效了. 例如: 张三的工资为5000,事务A中获取工资为5000,事务B获取工资为5…
一.缘由 众所周知MySQL从5.5.8开始,Innodb就是默认的存储引擎,Innodb最大的特点是:支持事务.支持行级锁. 既然支持事务,那么就会有处理并发事务带来的问题:更新丢失.脏读.不可重复读.幻读:相应的为了解决这四个问题, 就产生了事务隔离级别:未提交读(Read uncommitted),已提交读(Read committed),可重复读(Repeatable read),可序列化(Serializable). 之前在看事务隔离级别的时候,基本是一知半解.再次碰到,还是浆糊,所以…
MySQL和SQL Server两种数据库在REPEATABLE-READ事务隔离级别实现方式不同,导致使用上也存在差异. 在MySQL中,默认使用REPEATABLE-READ事务隔离级别,MySQL通过MVCC (Multiversion Concurrency Control)来实现REPEATABLE-READ事务隔离级别. 在MS SQL SERVER中,默认使用READ-COMMITED事务隔离级别,SQL Server通过LOCK来实现REPEATABLE-READ事务隔离级别.…
可重复读隔离级别,不允许存在幻读,该隔离级别之所以能够有效防止幻读现象的出现,是因为可重复读这个隔离级别有用到GAP锁(间隙锁).下面我们以解析SQL语句为切入点,来解释个中原因. 前提条件:①数据库的存储引擎为InnoDB: ②数据库的隔离级别为“可重复读”. SQL:DELETE FROM user WHERE id = 10; (1)当id是聚簇索引或唯一索引时: 此时是没有使用到GAP锁的,但是也保证了幻读现象的出现. 原因:如果id是主键,那么主键必然是“唯一且不为空”的:如果id是唯…
关于相关术语的专业解释,请自行百度了解,本文皆本人自己结合参考书和自己的理解所做的阐述,如有不严谨之处,还请多多指教. 事务有四种基本特性,叫ACID,它们分别是: Atomicity-原子性,Consistency-一致性,Isolation-隔离性,Durability-持久性. 接着关于ACID的理解和隔离性语法都是转的网上资料,大家可以顺便再了解熟悉下. 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事…
mysql中InnoDB引擎默认为可重复读的(REPEATABLE READ).修改隔离级别的方法,你可以在my.inf文件的[mysqld]中配置: transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE} 用户可以用SET TRANSACTION语句改变单个会话或者所有新进连接的隔离级别.它的语法如下: SET [SESSION | GLOBAL] TRANSACT…
一 [背景]   今天上午文能提笔安天下,武能上马定乾坤的登博给团队出了一道题目,谁先复现问题,奖励星巴克一杯.激起了一群忙碌的屌丝DBA的极大热情.问题是这样滴,如下图登博提示了几个细节:   1. code上的uk并未失效.   2. rr隔离级别.   3. 有并发线程的操作.二 [原理分析]1 事务隔离级别的基础知识: 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据. 提交读(Read Committed):只能读取到已经提交的数据…
1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约束没有被破坏 持久性:事务的提交结果,将持久保存在数据库中 2.事务并发会产生什么问题 1)第一类丢失更新:在没有事务隔离的情况下,两个事务都同时更新一行数据,但是第二个事务却中途失败退出, 导致对数据的两个修改都失效了. 例如: 张三的工资为5000,事务A中获取工资为5000,事务B获取工资为5…
一般的DBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle.SQL Server等,而MySQL却使用可重复读(Read-Repeatable,RR).要知道,越高的隔离级别,能解决的数据一致性问题越多,理论上性能损耗更大,可并发性越低.隔离级别依次为 SERIALIZABLE > RR > RC > Read-Uncommited 在SQL标准中,前三种隔离级别分别解决了幻象读.不可重复读和脏读的问题.那么,为什么MySQL使用可重复读作…
1. 什么是事务? 是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作:这些操作作为一个整体一起向系统提交,要么都执行.要么都不执行:事务是一组不可再分割的操作集合(工作逻辑单元): 2.事务的四大特性ACID 一个事务往往具有一下特性: 原子性(ATOMICITY):  一个事务要被完全的无二义性的做完或撤消.在任何操作出现一个错误的情况下,构成事务的所有操作的效果必须被撤消,数据应被回滚到以前的状态. 一致性(CONSISTENCY):  一个事务应该保护所有定义在数据上的不…
#TCL事物控制语言 : /* Transaction control language : 事物控制语言 事务: 一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行; 事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的; 处理事务的关键字: 建立事务: SET autocommit=0; START TRANSACTION; 结束事务: commit; #rollback; #回滚 设置断点: SAVEPOINT a; #设置…
一.什么是数据库事务 数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位.事务由事务开始与事务结束之间执行的全部数据库操作组成.--百度百科 比如,你有2条sql要执行,如果放到一个事务里,要么2个sql都执行成功,要么都失败.都执行成功了就提交事务,有一个失败了就回滚,不存在一个成功一个失败. 二.事务的ACID原则 这是数据库事务的核心所在. 1. 原子性(Atomicity) 比如现在A有80…
最近,在一次 mysql 死锁的生产事故中,我发现,关于 mysql 的锁.事务等等,我所知道的东西太碎了,所以,我试着用几个例子将它们串起来.具体做法就是通过不断地问问题.回答问题,再加上"适当"的比喻,来逐步构建脑子里的"知识树". 需要提醒一下,这篇博客并不适合小白,因为你需要先了解排它锁.共享锁.事务,最重要的是你需要知道事务中的锁是什么时候加上.什么时候打开的.而这篇博客更多的是希望把这些碎片化的知识给连接起来. 项目环境 mysql 版本:5.7.28-…
1. 不可重复读 所谓的不可重复读(Non-Repeatable Read)是指事务中两次查询的结果不一致,原因是在查询的过程中其他事务做了更新的操作. 例如,银行在做统计报表的时候,第一次查询a账户有1000元,第二次查询a账户有900元,原因是统计期间a账户取出了100元,这样导致多次统计报表的结果不一致. 不可重复读和脏读有点类似,但是脏读是读取了另一个事务未提交的脏数据,不可重复读是在事务内重复读取了别的线程已提交的数据. 2. 演示不可重复读 (1)b账户:首先在b账户中开启一个事务,…
MySqlInnoDB的事务隔离级别有四个:(默认是可重复读repeatable read) 未提交读 read uncommit : 在另一个事务修改了数据,但尚未提交,在本事务中SELECT语句可能会查询到这些未被提交的数据,而发生脏读. 提交读 read commit : 在一个事务中发生两次SELECT查询,当第一次SELECT执行完查询到一些数据,接下来另一个事务修改了这些数据并提交了,当第二次SELECT执行的时候查询到的数据和第一次SELECT的不同,而发生不可重复读.幻读问题,但…
1.数据库事物: 事物的概念 a给b打100块钱的例子 2.jdbc事物: 通过下面代码实现 private Connection conn = null; private PreparedStatement ps = null; try { conn.setAutoCommit(false);  //将自动提交设置为false ps.executeUpdate("修改1 SQL"); //执行修改1操作 ps.executeQuery("修改2 SQL");  /…
一 数据库事务的隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四个级别可以逐个解决脏读 .不可重复读 .幻读这几类问题. 1. Read UnCommitted(读未提交) 最低的隔离级别.一个事务可以读取另一个事务并未提交的更新结果. 2. Read Committed(读提交) 大部分数据库采用的默认隔离级别.一个事务的更新操作结果只有在该事务提交之后,另…
从本源来理解比较容易理解,如果只是描述概念和定义,容易让人云里雾里找不到方向.正好这两天在浏览mysql的文档,我可以简单在这里总结一下,帮助其他还没有理解的朋友,如果有错误也麻烦帮忙指正. 先讲一点背景知识: 首先明确一点,数据库的命令的执行者的封装基本抽象是Transaction,语句的执行都会有对应的Transaction对象,并且都会有对应的id来标识不同的Transaction.Transaction Id按照不同的时序来分配, 通俗点说,时间上来执行的早的transaction id…
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中的事务概念,ACID 原则,事务中常见的问题,问题造成的原因和事务隔离级别等这些方面的知识好好的整理了一下. 其实有关 SQL Server 中的事务,说实话因为内容太多, 话题太广,稍微力度控制不好就超过了我目前知识能力范围,就不是三言两语能够讲清楚的.所以希望大家能够指出其中总结的不足之处,对我…
mysql 命令重命名表RENAME TABLE 句法 RENAME TABLE tbl_name TO new_tbl_name[, tbl_name2 TO new_tbl_name2,...]更名是以原子方式(atomically)执行,这就意味着,当更名正在运行时,其它的任何线程均不能该表.这使得以一个空表替换一个表成为可能. CREATE TABLE new_table (...);RENAME TABLE old_table TO backup_table, new_table TO…
1.脏读:一个事务读到另外一个事务还没有提交的数据.解决方法:把事务隔离级别调整到READ COMMITTED,即SET TRAN ISOLATION LEVEL READ COMMITTED.这时我们重复上面的动作会发现事务二会一直等到事务一执行完毕再返回结果,因为此时事务以已经把自己的更改ROLLBACK了,所以事务二可以返回正确的结果. 2.更新丢失: 3. 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同.解决方法:把事务隔离级别调整到REPEATABLE READ.使用SE…
目录 背景脏读原因重现和避免不可重复读原因重现和避免幻读原因重现和避免嵌套事务导致的死锁备注 背景返回目录 昨天才发现如果一条数据被A事务修改但是未提交,B事务如果采用“读已提交”或更严格的隔离级别读取改数据,会导致锁等待,考虑到数据库默认的隔离级别是“读已提交”,在嵌套事务 + 子事务中有复杂的SQL查询,很可能会出现死锁,后面会给出嵌套事务导致死锁的示例. 先来看看:脏读.不可重复读和幻读. 脏读返回目录 原因返回目录 当B事务在A事务修改和提交之间读取被A事务修改的数据时,且B事务,采用了…