细谈Mysql事务
文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。
上一篇着重谈到了MySQL锁的概念,里面谈到了事务的概念,其实大部分开发者对于事务肯定不陌生,事务的概念其实就是一组SQL语句组成一个执行单元,如果单元中的某个SQL语句执行出现异常,则需要将整个事务进行回滚到未修改的状态。只有单元中全部SQL语句都成功执行,才会提交数据代表事务执行成功。而Mysql其实前几篇我们都已经知道是支持多种存储引擎的,其实正是因为MyISAM引擎不支持事务被InnoDB取代的原因。所以本篇文章主要是针对InnoDB引擎详细了解下事务这个概念。
事务特性
原子性: 事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
一致性:事务中包含的处理要满足数据库提前设置的约束,如主键约束或者NOT NULL 约束等。
隔离性:事务处理过程中的中间状态对外部是不可见的。
持久性:事务完成之后,它对于数据的修改是永久性的。
隔离性的四种隔离级别
InnoDB引擎支持的4种事务隔离级别分别是:读未提交、读已提交、可重复读、串行读。
读未提交:允许脏读,可以读取其他session中未提交的脏数据。
读已提交:不可读取其他session尚未提交的数据,只有其他session数据已提交才能读取到,为不重复读。
可重复读:该级别下可重复读,InnoDB引擎默认采用可重复读,不允许读取还未提交的脏数据,但是可能存在InnoDB独有的幻读。
串行读:该级别下隔离程度最高,事务只能一个接着一个串行执行,无法并发执行。每次串行读都需要获得表级共享锁,读写操作都会阻塞。
幻读
事务在插入一条已经经过检查不存在的记录,但是插入结果是数据已经存在,之前的检查操作如同幻影。Mysql默认采用可重复读级别,所以只可能出现幻读的情况。
设置事务隔离级别
可以在my.ini文件中[mysqld]下配置transaction-isolation属性,隔离性的四个值为:READ-UNCOMMITTED、READ-COMMITIED、REPEATABLE-READ、SERIALIZABLE,分别对应读未提交、读已提交、可重复读、串行读四种隔离级别。
事务分类
事务一般分为两种:隐式事务和显示事务。在Mysql中,事务默认是自动提交的,所以说每个DML语句实际上就是一次事务的过程。
隐式事务:没有开启和结束的标志,默认执行完SQL语句就自动提交,比如我们经常使用的INSERT、UPDATE、DELETE语句就属于隐式事务。
显示事务:需要显示的开启关闭,然后执行一系列操作,最后如果全部操作都成功执行,则提交事务释放连接,如果操作有异常,则回滚事务中的所有操作。
事务使用步骤
开启事务:关闭自动提交,然后开启事务。
事务操作:一系列DML语句执行。
事务结束:根据事务操作成功与否选择提交事务或者回滚事务操作。
接下来我们简单的使用事务实现用户A向用户B转账的操作:
创建用户表并插入两条用户数据:
配置数据库连接信息:
接下来从连接池中取出一个数据库连接并进行数据库连接:
数据库连接成功,则使用connection对象开启事务:
然后查询转账账号与待转账账号是否存在,并进行转账等一系列操作,这里由于魔鬼回调的原因我这里使用async库变成链式调用:
最后根据事务操作的成功或失败进行事务提交或者事务回滚,并且释放数据库连接:
然后可以测试转账成功的情况可以发现转账操作成功了
再次测试转账失败的操作可以发现扣除A积分和增加B积分的操作全部被回滚了,所以A和B的积分余额都没有发生改变
欢迎关注公众号:程序猿周先森。文章原创于微信公众号,本平台不定时更新。
细谈Mysql事务的更多相关文章
- 粗谈MySQL事务的特性和隔离级别
网上对于此类的文章已经十分饱和了,那还写的原因很简单--作为自己的理解笔记. 前言 此篇文章作为自己学习MySQL的一些个人理解,使用的引擎是InnoDb.首先先讲讲事务的概念,在<高性能 ...
- 浅谈MySQL事务及隔离级别
目录 1.什么是事务 2.事务的ACID属性 2-1.原子性(Atomicity) 2-2.一致性(Consistency) 2-3.隔离性(Isolation) 2-4.持久性(Durability ...
- MySQL事务内幕与ACID
MySQL的事务实现严格遵循ACID特性,即原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability).为了避免一上来就陷入对ACID ...
- (转)运维角度浅谈MySQL数据库优化
转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...
- mysql事务和并发控制
谈到事务,首先想到的问题是并发控制.比如两个用户同时操作数据库里面的一张表,一个正在读数据,一个正在删除数据,那么读数据的读出的结果究竟是多少?并发可以提高系统的性能,让多个用户同时操作一份数据,但为 ...
- Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解
在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...
- 运维角度浅谈MySQL数据库优化(转)
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
- 从运维角度浅谈 MySQL 数据库优化
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
- mysql事务隔离级别详解和实战
A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据 但是 在A事务中查询的话 查到的都是操作之后的数据 没有提交的数据只有自己看得到,并没有update到数据库. 查看InnoD ...
随机推荐
- 设置IntelliJ IDEA支持lambda表达式
使用IntelliJ IDEA做为开发工具,对基于maven的java工程,如果要编写lambda表达式,先确保安装并使用了jdk1.8或者更高版本,然后再要做一些设置才能正常编译和执行,具体表现在m ...
- Linux 笔记 - 第十三章 Linux 系统日常管理之(四)Linux 中 rsync 工具和网络配置
博客地址:http://www.moonxy.com 一.前言 rsync 命令是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件,可以理解为 remote sync(远程同步) ...
- Redis会遇到的问题以及解决方案
1.缓存雪崩 发生场景:当Redis服务器重启或者大量缓存在同一时期失效时,此时大量的流量会全部冲击到数据库上面,数据库有可能会因为承受不住而宕机 解决办法: 1)随机均匀设置失效时间 2)设置过期标 ...
- 深度学习论文翻译解析(五):Siamese Neural Networks for One-shot Image Recognition
论文标题:Siamese Neural Networks for One-shot Image Recognition 论文作者: Gregory Koch Richard Zemel Rusla ...
- 还在用SVN的人,要不要学Git?
还在用SVN的人,要不要学Git? 提出这个问题,是因为很多小伙伴还不会使用Git. 在Git之前,是SVN的天下. SVN诞生于2001年,由于较为先进的管理方式而迅速取代了CVS. 很多80后小伙 ...
- Spring 梳理 - ContentNegotiatingViewResolver
ContentNegotiatingViewResolver,这个视图解析器允许你用同样的内容数据来呈现不同的view.它支持如下面描述的三种方式: 1)使用扩展名http://localhost:8 ...
- JVM 调优 - jhat
Java命令学习系列(五)——jhat 2016-01-21 分类:Java 阅读(8708) 评论(3) 阿里大牛珍藏架构资料,点击链接免费获取 jhat(Java Heap Analysis To ...
- Ubuntu 卸载openJDK
如果你在 Ubuntu 软件中心安装过 OpenJDK,请先使用如下命令将其删除: $ sudo apt-get purge openjdk*
- MongoDB的查询索引
目录 为什么要建立索引? 索引的分类有哪些? _id索引 单键索引 多键索引 复合索引 过期索引 hello,今天是万圣节
- Spring Boot 整合视图层技术
这一节我们主要学习如何整合视图层技术: Jsp Freemarker Thymeleaf 在之前的案例中,我们都是通过 @RestController 来处理请求,所以返回的内容为json对象.那么如 ...