mysql事务

数据库事务

浪尽此生 提交于 2020-04-06 08:12:13
  事务是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,也就是说要么全部执行,要么全部都不执行。 四大属性 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。 隔离级别    默认事务的隔离级别 mysql> SHOW VARIABLES LIKE 'tx_isolation'; 默认为 可重复读 设置当前会话隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; 本文索引关键字: 原子性(atomicity):http://www.cnblogs.com/huanStephen/p/8075938.html#atomicity 一致性(consistency):http://www.cnblogs

数据库隔离级别

陌路散爱 提交于 2020-04-05 23:12:08
数据库隔离级别 如果没有隔离级别会出现的问题 脏读 意思是读取到了事务正在修改的数据,如果事务回滚,那么拿到的数据就是错误的 时间 事务A 事务B 1 开始事务 2 读取quantity为5 3 修改quantity为4 4 开始事务 5 读取到quantity为4 6 发生错误,回滚,quantity为5 7 提交事务 在按照正常逻辑quantity应该为5 不可重复读 时间 事务A 事务B 1 开始事务 2 读取quantity为5 3 开始事务 4 修改quantity为4 5 提交事务 6 读取quantity为4 7 提交事务 在同一个事务内,两次读取同一个数据产生不一致 幻读 时间 事务A 事务B 1 开始事务 2 更新所有行的quantity为100 3 开始事务 4 插入一行quantity为5 5 提交事务 6 查询所有行的quantity 7 提交事务 当一个事务内更新所有行后,另一个事务插入了新行,当再次查看记录时,发现有未更新的记录,好像幻觉一样 丢失更新 第一种情况: 时间 事务A 事务B 1 开始事务 2 查询到quantity为10 3 开始事务 4 查询到quantity为10 5 更新quantity为11 6 提交事务 7 更新quantity为9 8 事务回滚,quantity为10 可以看到,回滚的事务把正常事务的数据覆盖了

MySQL事务隔离性

好久不见. 提交于 2020-04-05 19:23:31
事务隔离性 当多个线程都开启事务操作数据库中数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性。 如果没有隔离,会发生的几种问题 脏读(Dirty Read) 一个事务处理过程里读取了另一个未提交的事务中的数据 不可重复读(NonRepeatable Read) 对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询的间隔期间,另外一个事务修改并提交了该数据。 不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。 在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……。 幻读(Phantom Read) 在一个事务中读取到了别的事务插入的数据,导致前后不一致。 事务A 按照一定条件进行数据读取,期间事务B插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据。 不同隔离级别的问题 MySQL的锁类型 表锁 对一整张表加锁,并发能力低下(即使有分读锁、写锁),一般在DDL处理时使用,myisam也是表锁。 行锁 只锁住特定行的数据,并发能力强,MySQL一般都是用行锁来处理并发事务。 如果用到无索引的字段

Mysql-锁

坚强是说给别人听的谎言 提交于 2020-04-04 04:19:42
Mysql中默认的是MyISAM数据引擎,可惜此引擎不支持事务处理,我们需要将默认的数据引擎改为InnoDB。 InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。 启动InnoDB引擎的方法如下: 1)关闭mysql的服务 2)修改my.ini 将default-storage-engine=INNODB前的注释(#)去掉 将skip-innodb这行注释(加上#) 3)保存后重启mysql服务; InnoDB实现了以下两种类型的行锁。 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。 排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。 另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。 意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。 意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。 InnoDB行锁模式兼容性列表 如果一个事务请求的锁模式与当前的锁兼容,InnoDB就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。 意向锁是InnoDB自动加的,不需用户干预。对于UPDATE

MySQL 21道高频面试题及其解析

人盡茶涼 提交于 2020-04-03 23:52:04
Q1:MySQL主要有哪些存储引擎,分别适合哪些应用场景? 答:主要有①MyISAM,是5.5版本之前的默认存储引擎,支持表级锁,不支持事务和外键,并发效率较低,读取数据快,更新数据慢。适合以读操作为主,并且对并发性要求较低的应用。②InnoDB,MySQL目前的默认存储引擎,支持行级锁、事务和外键,并发效率好。适合对事务的完整性和并发性、数据的准确性要求比较高,增删操作多的应用。③Memory,所有的数据都保存在内存中,访问速度快,一旦服务关闭数据将丢失。适合更新不太频繁的数据量小的表用来快速得到访问结果。④Archive、Federated等。 Q2:索引是什么? 答:MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 Q3:索引的优缺点有哪些? 答:①优势:提高数据检索的效率,降低数据库的IO成本。通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。②劣势:实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引列也是要占用空间的。 虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE

30.6. MySQL并发控制,加锁和事务,隔离级别,日志等

点点圈 提交于 2020-04-02 12:12:18
并发控制 锁粒度: 表级锁 行级锁 锁: 读锁:共享锁,只读不可写(包括 自己当前用户 和当前事务) ,多个读互不阻塞 写锁:独占锁,排它锁,写锁会阻塞其它事务(不包括当前事务)的读和它锁 实现 存储引擎:自行实现其锁策略和锁粒度 服务器级:实现了锁,表级锁,用户可显式请求 分类: 隐式锁:由存储引擎自动施加锁 显式锁:用户手动请求 锁策略:在锁粒度及数据安全性寻求的平衡机制 显式使用锁 LOCK TABLES 加锁 lock tables tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] ... lock_type: READ ,WRITE UNLOCK TABLES 解锁 FLUSH TABLES [tb_name[,...]] [WITH READ LOCK] 关闭所有正在打开的表,同时清除掉查询缓存以及准备好的语句缓存, 如果加上with read lock 选项的话,它代表关闭所有正在打开的表并加上全局锁(不清除缓存了), 通常在备份前加全局读锁 SELECT clause [FOR UPDATE | LOCK IN SHARE MODE] 查询时加写或读锁 注意点1(加锁): 注意,读锁加到表上之后,此表将只能读,不能进行其他任何操作。

MySQL 复习笔记

笑着哭i 提交于 2020-03-31 05:27:31
本文内容 SQL 语句 创建数据库 创建数据表 数据完整性约束 四种基本字符类型说明 SQL 基本语句 类型转换函数 日期函数 数学函数 字符串函数 合并结果集 union CASE 函数用法 IF ELSE 语法 WHILE 循环语法 子查询 表连接 join 事务 视图 触发器 存储过程 分页存储过程 索引 临时表 1,SQL 语句 SQL 语言:结构化的查询语言(Structured Query Language),是关系数据库管理系统的标准语言。是一种解释语言,写一句执行一句,不需要整体编译执行。 语法特点: 1.没有“ ”,字符串使用‘ ’包含 2.没有逻辑相等,赋值和逻辑相等都是= 3.类型不再是最严格的。任何数据都可以包含在‘ ’以内 4.没有 bool 值的概念,但是在视图中可以输入true/false 5.有关系运算符:> < >= <= = <> != ,它返回一个bool值 6.有逻辑运算符: !(not) &&(and) ||(or) 7.不区别大小写 2,创建数据库 语法: create database 数据库名称 on primary --默认在主文件组上 ( name='逻辑名称_data' , --当你发现它不是一句完整的sql语句,而仅仅是一个处理结构中的某一句的时候,就需要添加 , size=初始大小, --数值不包含在‘’以内

10分钟梳理MySQL核心知识点

被刻印的时光 ゝ 提交于 2020-03-31 04:09:29
今天我们用10分钟,重点梳理一遍以下几方面: 数据库知识点汇总; 数据库事务特性和隔离级别; 详解关系型数据库、索引与锁机制; 数据库调优与最佳实践; 面试考察点及加分项。 一、数据库的不同类型 1.常用的关系型数据库 Oracle:功能强大,主要缺点就是贵 MySQL:互联网行业中最流行的数据库,这不仅仅是因为MySQL的免费。可以说关系数据库场景中你需要的功能,MySQL都能很好的满足,后面详解部分会详细介绍MySQL的一些知识点 MariaDB:是MySQL的分支,由开源社区维护,MariaDB虽然被看作MySQL的替代品,但它在扩展功能、存储引擎上都有非常好的改进 PostgreSQL:也叫PGSQL,PGSQL类似于Oracle的多进程框架,可以支持高并发的应用场景,PG几乎支持所有的SQL标准,支持类型相当丰富。PG更加适合严格的企业应用场景,而MySQL更适合业务逻辑相对简单、数据可靠性要求较低的互联网场景。 2.NoSQL数据库(非关系型数据库) Redis:提供了持久化能力,支持多种数据类型。Redis适用于数据变化快且数据大小可预测的场景。 MongoDB:一个基于分布式文件存储的数据库,将数据存储为一个文档,数据结构由键值对组成。MongoDB比较适合表结构不明确,且数据结构可能不断变化的场景,不适合有事务和复杂查询的场景。 HBase:建立在HDFS

[MySQL] 有没有解决幻读问题

孤街浪徒 提交于 2020-03-30 16:36:24
默认隔离级别下 , mysql没有解决幻读问题 , 需要应用代码里加一个锁来解决 幻读问题是啥? 默认的隔离级别是可重复读 REPEATABLE-READ , 在这个模式下出现幻读的例子一般是这两种情况: 事务1和事务2同时 , 事务1读数据 , 事务2插入数据提交 , 事务1插入同样的数据时报错说已经重复了 , 我明明刚才查的时候没有 , 为啥报重复了? 事务1和事务2同时 , 事务1读数据 , 事务2插入数据提交 , 事务1更新数据可以把事务2的数据也一块给更了 , 明明刚才没有怎么突然多出来数据了? 解决方式是在select读时候的sql中增加for update , 会把我所查到的数据锁住 , 别的事务根本插不进去 , 这样就解决了,这里用到的是mysql的next-key locks 来源: https://www.cnblogs.com/taoshihan/p/12599078.html

Spring+iBatis+Atomikos实现JTA事务

江枫思渺然 提交于 2020-03-30 14:03:54
Atomikos分两个:一个是开源的TransactionEssentials,一个是商业的ExtremeTransactions。 TransactionEssentials的主要特征:JTA/XA 事务管理 —— 提供事务管理和连接池不需要应用服务器 —— TransactionEssentials可以在任何Java EE应用服务器中运行,也就是不依赖于任何应用服务器开源 —— TransactionEssentials是遵守Apache版本2许可的开源软件专注于JDBC/JMS —— 支持所有XA资源,但是资源池和消息监听是专供JDBC和JMS的与Spring 和 Hibernate 集成 —— 提供了描述如何与Spring和Hibernate集成的文档 一、环境 spring 2 ibatis2 AtomikosTransactionsEssentials-3.7.0 下载地址:http://www.atomikos.com/Main/InstallingTransactionsEssentials MySQL-5.1 : 数据库引擎为InnoDB,只有这样才能支持事务 JDK1.6 Oracle10 二 jar包 Atomikos jar必须包 transactions-jdbc.jar transactions-jta.jar transactions.jar