mysql事务

Mysql并发控制

杀马特。学长 韩版系。学妹 提交于 2019-11-29 13:15:55
最近在看Mysql的并发控制,事务处理等知识,做些整理。 并发控制目的是当多个连接对数据库进行修改时保证数据的一致性。现在mysql的InnoDB在update,delete时使用行级锁,对于select会结合MVCC保证一致性。 1、 并发控制 MySQL提供两个级别的并发控制:服务器级(the server level)和存储引擎级(the storage engine level)。加锁是实现并发控制的基本方法,MySQL中锁的粒度: (1) 表级锁:MySQL独立于存储引擎提供表锁,例如,对于ALTER TABLE语句,服务器提供表锁(table-level lock)。 (2) 行级锁:InnoDB和Falcon存储引擎提供行级锁,此外,BDB支持页级锁。InnoDB的并发控制机制,下节详细讨论。 另外,值得一提的是,MySQL的一些存储引擎(如InnoDB、BDB)除了使用封锁机制外,还同时结合MVCC机制,即 多版本两阶段封锁协议MVCC(Multiversion two-phrase locking protocal) ,来实现事务的并发控制,从而使得只读事务不用等待锁,提高了事务的并发性。 数据库的事务处理的原则是保证ACID的正确性。 2、事务处理 2.1 事务的ACID特性 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性: (1)原子性

数据库面试知识点总结

限于喜欢 提交于 2019-11-29 12:29:00
数据库锁模块 MyISAM与InnoDB关于锁方面的区别是什么? MyISAM默认用的是表级锁,不支持行级锁( 在对数据库进行操作时只会锁住被操作的行 ) InnoDB默认用的是行级锁,也支持表级锁( 在对数据库进行操作时会锁住整张表 ) MyISAM不支持事务 InnoDB支持事务 数据库操作不走索引时使用的是表级锁 MyISAM 在该引擎下会默认添加表锁,当对数据进行select操作时会为表添加一个表级别的读锁;当进行update、insert和delete操作时会自动加上表级别的写锁。 适用场景 频繁执行全表count语句,MyISAM中有一个变量保存了整个表的行数 对数据进行增删改的频率不高(因为增删改会涉及到锁表操作),查询非常频繁 没有事务的场景 InnoDB 在该引擎下会默认使用的是行锁,行级锁与表级锁的共享性和排它性是一样的,只不过作用的范围不同,行级锁只作用于被上锁的行。 适用场景 数据增删改查都相当频繁 可靠性要求比较高,要求支持事务 数据库锁的分类 读锁 读锁又被称为 共享锁 ,因为一个会话对数据库进行读操作不会阻塞其它会话的读操作,但是会阻塞其它会话的写操作。 在进行select操作的后面加上for update将会添加排它锁,加lock in share mode会添加共享锁 写锁 写锁又被称为 排它锁

Mysql干货

白昼怎懂夜的黑 提交于 2019-11-29 12:23:46
索引相关 关于MySQL的索引,曾经进行过一次总结,文章链接在这里 Mysql索引原理及其优化. 1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. 3. Hash索引和B+树所有有什么区别或者说优劣呢? 首先要知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据. B+树底层实现是多路平衡查找树 .对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据. 那么可以看出他们有以下的不同: hash索引进行等值查询更快(一般情况下),但是却 无法进行范围查询 . 因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询.而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围. hash索引不支持使用索引进行排序 ,原理同上. hash索引不支持模糊查询 以及多列索引的最左前缀匹配.原理也是因为hash函数的不可预测

Go操作MySQL

别说谁变了你拦得住时间么 提交于 2019-11-29 12:15:22
MySQL是常用的关系型数据库,本文介绍了Go语言如何操作MySQL数据库。 Go操作MySQL 连接 Go语言中的 database/sql 包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的数据库驱动。使用 database/sql 包时必须注入(至少)一个数据库驱动。 我们常用的数据库基本上都有完整的第三方实现。例如: MySQL驱动 下载依赖 go get -u github.com/go-sql-driver/mysql 使用MySQL驱动 func Open(driverName, dataSourceName string) (*DB, error) Open打开一个dirverName指定的数据库,dataSourceName指定数据源,一般包至少括数据库文件名和(可能的)连接信息。 import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) func main() { // DSN:Data Source Name dsn := "user:password@tcp(127.0.0.1:3306)/dbname" db, err := sql.Open("mysql", dsn) if err != nil { panic(err) } defer db.Close() } 初始化连接

事务的四个隔离级别

眉间皱痕 提交于 2019-11-29 12:05:28
数据库中隔离级别的操作 设置隔离级别: set tx_isolation = 'READ-UNCOMMITTED' 查看隔离级别: select @@tx_isolation 一、Read Uncommitted -- 读取未提交内容 一个事务可以查看到未提交的内容 常产生脏读问题(脏读:读取到其他事务未提交(执行)的内容) 对同一数据表开启A、B两个事务(A、B事务交叉) start transaction A事务只查询数据表中内容,B事务做增删改操作但不commit(提交) A事务依旧可以查询到表中的数据改变(查询到未提交的内容--脏读) 二、Read Committed -- 读取提交内容 一个事务只能查看已提交的内容 常产生不可重复读的问题(不可重复读:同一事务中执行相同的select语句得到不同的结果) 对同一数据表开启A、B两个事务(A、B事务交叉) start transaction A事务只查询数据表中内容,B事务做增删改操作但不commit(提交) A事务查询不到表中的数据改变的内容 B事务提交 A查到的数据改变(A两次查询,产生不同的结果--不可重复读) 三、Repeatable Read -- 可重读 同一事务的多个实例并发读取数据时得到同一结果 MySQL的默认事务隔离级别 常产生幻读问题(幻读:多次读取时产生不同结果(幻影行)) 对同一数据表开启A

mysql事务

半城伤御伤魂 提交于 2019-11-29 10:15:33
本篇文章主要从事务的分类,操作,事务隔离级别几个方面进行阐述。 一、概述 事务是数据库系统区别文件系统的一个重要特性。 事务会把数据库从一种状态转为另一种状态。要么都修改,要么都不改。 事务可以是一个简单的sql,也可以是一个复杂的sql,事务是访问并更新数据库中各个数据项的一个程序执行单元 事务的四大特性为ACID,而innodb存储引擎完全符合ACID: 1、原子性(automicity):指整个数据库事务不可分割。要么都执行,要么都不执行。 2、一致性(consistency):指事务将数据库从一种状态转为另一种一致的状态,在事务开始前和结束后,数据库完整约束没有被破坏。 3、隔离性(isolation):(其他称呼:并发控制,可串行化,锁)指各个读写事务对象对其他事务操作相互分离,不可见。 4、持久性(durability):指事务完成后,其结果是永久的,即使机器宕机,也能够恢复。 二、提交方式 1.显式开启和提交。 使用begin或者start transaction来显式开启一个事务,显式开启的事务必须使用commit或者rollback显式提交或回滚。几种特殊的情况除外:行版本隔离级别下的更新冲突和死锁会自动回滚。 在存储过程中开启事务时必须使用start transaction,因为begin会被存储过程解析为begin...end结构块。 2.自动提交。

MySQL详解--锁

旧街凉风 提交于 2019-11-29 09:59:03
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL锁机制的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议。 MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。 MySQL这3种锁的特性可大致归纳如下。 开销、加锁速度、死锁、粒度、并发性能 l 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 l 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 l 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

MySQL常见知识点2

孤街醉人 提交于 2019-11-29 09:47:24
在MySQL数据库中,常用的引擎主要就是2个:Innodb和MyIASM。 首先: 1.简单介绍这两种引擎,以及该如何去选择。 2.这两种引擎所使用的数据结构是什么。 1. a.Innodb引擎,Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。它本身实际上是基于Mysql后台的完整的系统。Mysql运行的时候,Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是,该引擎是不支持全文搜索的。同时,启动也比较的慢,它是不会保存表的行数的。当进行Select count(*) from table指令的时候,需要进行扫描全表。所以当需要使用数据库的事务时,该引擎就是首选。由于锁的粒度小,写操作是不会锁定全表的。所以在并发度较高的场景下使用会提升效率的。 b.MyIASM引擎,它是MySql的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行Insert插入和Update更新语句时,即执行写操作的时候需要锁定这个表。所以会导致效率会降低。不过和Innodb不同的是,MyIASM引擎是保存了表的行数,于是当进行Select count(*) from table语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的

Spring事务的配置、参数详情及其原理介绍(Transactional)

£可爱£侵袭症+ 提交于 2019-11-29 08:45:52
   Spring 事务管理 分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。                 声明式事务有两种方式 ,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于 @Transactional 注解的方式。    需要明确几点:   1、默认配置下 Spring 只会回滚运行时、未检查异常(继承自 RuntimeException 的异常)或者 Error。   2、@Transactional 注解只能应用到 public 方法才有效。   3、@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。然而仅仅 @Transactional 注解的出现不足以开启事务行为,它仅仅是一种元数据,能够被可以识别 @Transactional 注解和上述的配置适当的具有事务行为的beans所使用。其实是 <tx:annotation-driven/>元素的出现开启了事务行为。   4、注解不可以继承,建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。当然可以在接口上使用 @Transactional

关于mysql事务行锁for update实现写锁的功能

Deadly 提交于 2019-11-29 08:39:47
关于mysql事务行锁for update实现写锁的功能 读后感:用切面编程的理论来讲,数据库的锁对于业务来说是透明的。spring的事务管理代码,业务逻辑代码,表锁,应该是三个不同的设计层面。 在电子商务里,经常会出现库存数量少,购买的人又特别多,大并发情况下如何确保商品数量不会被多次购买. 其实很简单,利用事务+for update就可以解决. 我们都知道for update实际上是共享锁,是可以被读取的.但是如何在执行时,不被读取呢. 简单来说:假设现在库存为1,现在有A和B同时购买 先开启一个事务 begin; select stock from good where id=1 for update;//查询good表某个商品中stock的数量 查出来后,在程序里在判断这个stock是否为0(你用什么语言,不关我事) 最后在执行 update good set stock=stock-1 where id=1 最后在 commit 但是这个时候B也是select stock from good where id=1 for update;注意:for update不能省略..这个时候会出现被锁住,无法被读取. 所以这就能够保证了商品剩余数量为1的一致性 来源: CSDN 作者: liangdu_Zuker 链接: https://blog.csdn.net