mysql事务

事务隔离级别与实现——事务隔离:为什么你改了我还看不见?

谁都会走 提交于 2020-01-22 09:56:52
参考文章: https://time.geekbang.org/column/article/68963 目录 隔离性与隔离级别 事务隔离的实现 事务的启动方式 事务就是要保证一组数据库操作,要么全部成功,要么全部失败。 MySQL 原生的 MyISAM 引擎就不支持事务,本文以 InnoDB 为例,剖析 MySQL 在事务支持方面的特定实现。 隔离性与隔离级别 1、事务的隔离性:ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性) 2、并发问题:脏读、不可重复读、幻读 3、隔离级别:读未提交、读提交、可重复读、串行化 读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。 读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。 可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。 串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。 举例: mysql> create table T(c int) engine=InnoDB; insert into T(c) values(1); 在实现上

springboot集成分布式事务seata-1.0.0的AT模式(nacos作为注册中心以及配置中心)

你离开我真会死。 提交于 2020-01-22 02:12:39
Seata 是什么? Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳的度过历年的双11,对各BU业务进行了有力的支撑。经过多年沉淀与积累,商业化产品先后在阿里云、金融云进行售卖。2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备。 seata的官方文档: http://seata.io/zh-cn/index.html seata github地址: https://github.com/seata/seata 设计初衷 对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入 高性能:减少分布式事务解决方案所带来的性能消耗 发展远景 架构 TC - 事务协调者 维护全局和分支事务的状态,驱动全局事务提交或回滚。 TM - 事务管理器 定义全局事务的范围:开始全局事务、提交或回滚全局事务。 RM - 资源管理器 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。 微服务框架支持 目前已支持 Dubbo、Spring Cloud、Sofa-RPC

mysql 事务的ACID特性

老子叫甜甜 提交于 2020-01-21 03:16:47
原子性(Atomicity) 一个事务事务的操作要么全部成功,要么全部失败 一致性(Consistency) 事务开始之前和结束之后,数据库的完整性没有被破坏,写入的资料完全符合所有的预设的规则 这里一致性可能比较难理解,比方说:A转账给B用户100元,但是A只有90元,转完之后A就是-10元了,站在数据结构层是没有问题的,但是在应用层,这个就不符合预设的规则(我们要保证用户的钱>=0) 隔离性(Isolation) 数据库允许并发的事务同时对数据库读写和修改的能力,可以防止多个事务并发执行时导致数据不一致性 持久性(Durability) 事务处理结束后,对数据的修改是永久的,即便系统故障也不会丢失 三 事务并发带来的问题 3.1 脏读 1.事务B更新年龄18 2.事务A读取数据库信息,年龄是18 3.事务B回滚 那么这个就是脏读 3.2 不可重复读 1.事务A先读取数据,年龄为16 2.事务B跟新数据,年龄为18 3.事务B提交 4.事务A再读取数据,年龄为18 事务A连续读取两次的数据都不一样,为不可重复读 3.3 幻读 1.事务A读取年龄大于15的数据,发现有1条记录 2.事务B插入一条记录,并提交 3.事务A再读取年龄大于15的数据,发现有2条记录 事务A就好像出现了幻觉一样,一般幻读出现在范围查询 解决上面的3个问题,就要通过事务的隔离性来解决了

MySQL两种存储引擎: MyISAM和InnoDB 简单总结

我是研究僧i 提交于 2020-01-21 00:16:47
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,但却 有一个缺点:不支持事务处理(transaction) 。不过,在这几年的发展下,MySQL也导入了InnoDB(另一种数据库引擎),以强化参考完整性与并发违规处理机制,后来就逐渐取代MyISAM。 InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。 MyISAM和InnoDB两者之间有着明显区别,简单梳理如下: 1) 事务支持 MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。 MyISAM是非事务安全型的,而InnoDB是事务安全型的,默认开启自动提交,宜合并事务,一同提交

MYSQL之视图、触发器、事务

北城余情 提交于 2020-01-20 22:18:51
一 视图 视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用 #两张有关系的表 mysql> select * from course; +-----+--------+------------+ | cid | cname | teacher_id | +-----+--------+------------+ | 1 | 生物 | 1 | | 2 | 物理 | 2 | | 3 | 体育 | 3 | | 4 | 美术 | 2 | +-----+--------+------------+ rows in set (0.00 sec) mysql> select * from teacher; +-----+-----------------+ | tid | tname | +-----+-----------------+ | 1 | 张磊老师 | | 2 | 李平老师 | |

浅析Mysql的隔离级别及MVCC

只谈情不闲聊 提交于 2020-01-20 12:39:25
一、Mysql的四个隔离级别 预备工作: 先创建一个test数据库及account表, create database test;use test; create table account( id int not null, balance float not null, PRIMARY KEY ( id) ) 向account中插入两条测试数据 INSERT INTO table(id,balance) VALUES (1,1000); INSERT INTO table(id,balance) VALUES (2,1000);    开启两个控制台窗口,当做两个用户(A和B) 1.1 READ UNCOMMITTED(未提交读) 也即RU,在READ UNCOMMITTED级别,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读(Dirty Read)。这个级别会导致很多问题,从性能上来说,READ UNCOMMITTED不会比其他的级别好太多,但却缺乏其他级别的很多好处,除非真的有非常必要的理由,在实际应用中一般很少使用。 A用户操作如下: set session transaction isolation level read uncommitted; start transaction; select * from

初识MariaDB存储引擎

﹥>﹥吖頭↗ 提交于 2020-01-20 07:01:45
在看MariaDB的存储引擎之前,可以先了解MySQL存储引擎。 MySQL常用的存储引擎: MyISAM存储引擎:是MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。 MyISAM表还支持3中不同的存储格式: 1 静态表 2 动态表 3 压缩表 静态表是默认的存储格式,静态表中的字段都是非变长的字段,优点是:存储非常迅速,容易缓存,出现故障容易恢复;缺点是:占用的空间通常比动态表多。(注意: 在存储时,列的宽度不足时,用空格补足,当时在访问的时候并不会得到这些空格) 动态表的字段是变长的,优点是:占用的空间相对较少,但是频繁地更新删除记录会产生碎片,需要定期改善性能,并且出现故障的时候恢复相对比较困难。 压缩表占用磁盘空间小,每个记录是被单独压缩的,所以只有非常小的访问开支。 MyISAM表存储为三个文件: .frm 文件存储表定义。数据文件的扩展名为 .MYD (MYData)。索引文件的扩展名是 .MYI (MYIndex) InnoDB存储引擎:提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。 MEMORY(heap)存储引擎:memory实际是heap的替代品。使用存在内存中的内容来创建表

分布式事务

北战南征 提交于 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-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回滚

Spring事务的基本原理、传播属性、隔离级别

喜夏-厌秋 提交于 2020-01-19 17:45:28
一、事务的基本要素(ACID) 事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功。其必须遵循四个原则(ACID)。 原子性(Atomicity):指一个事务要么全部执行,要么不执行,也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成。 一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是应该处于正确的状态,即数据完整性约束没有被破坏;如银行转帐,A转帐给B,必须保证A的钱一定转给B,一定不会出现A的钱转了但B没收到,否则数据库的数据就处于不一致(不正确)的状态。 隔离性(Isolation):并发事务执行之间互不影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性; 持久性(Durability):事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因比如遇到系统故障或断电造成数据不一致或丢失。 二、数据库隔离级别 隔离级别 隔离级别的值 脏读 不可重复读 幻读 读未提交 Read-Uncommitted 0 是 是 是 不可重复读 (read-committed) 1 否 是 否 可重复读 (repeatable-read) 2 否 否