数据库事务与锁(一)——事务的简单介绍
前言
最近系统上线了,这两天收到反馈,操作按钮动不了了、删除按钮动不了了等等类似的问题,仔细查看日志错误,提示:Lock wait timeout exceeded; try restarting transaction。于是乎,就想把数据库事务与锁的知识深入了解一下,也为自己解决问题提供思路。本系列文章主要源于Kevin老师的《一次性彻底搞定数据库事务》,感谢老师的讲解。在本篇文章中,我们先来说说事务。
概念
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列读或写操作。其目的是提供三种方法:失败恢复到正常状态的方法、保持一致性的方法、并发操作之间保持隔离的方法,通俗的说是那一系列操作要么完全地执行,要么完全地不执行。
特性
A:原子性(Actomicity),该系列操作作为一个整体,不能被分割,要么全执行,要么都不执行;
C:一致性(Consistency),确保数据从一种状态变为另一种状态;
I:隔离性(Isolation),多个事务并发执行时,彼此之间互不影响;
D:持久性(Durability),当事务提交成功后,对数据的修改要永久保存在数据库中。
并发异常
回滚丢失:由于一个事务的失败回滚导致另一个事务的更新丢失了;
覆盖丢失:更新被其他事务给覆盖了;
脏读:一个事务读取了另一个事务修改未提交的数据;
不可重复读:一个事务对同一行数据执行了两次或更多次查询,但是却得到了不同的结果;
幻读:与不可重复读相似,不过针对的是数据的数量,当一个事务查询记录两次或多次时,得到的数量不一致。
隔离级别
读未提交:一个事务的更新语句没有提交,但是别的事务可以读到这个改变;
读已提交:一个事务只能看到其他事务已经提交的更新、看不到未提交的更新,消除了脏读和回滚丢失,Oracle/Sqlserver就是此类;
可重复读:一个事务中进行两次或多次同样的对于数据内容的查询,得到的结果是一样的,但不保证对于数据条数的查询是一样的,只要存在读改行数据就禁止写,消除了不可重复读和覆盖丢失,如Mysql,需要注意的是虽然Mysql的隔离级别为可重复读,理论上是不能解决幻读异常的,但由于Next-key,Gap-lock的存在,使得Mysql可以避免幻读问题;
串行化:事务执行不允许其他事务操作,只要存在读就禁止写,但可以同时读,消除了幻读,但是效率太低。
隔离级别\并发异常 | 回滚丢失 | 脏读 | 不可重复读 | 覆盖丢失 | 幻读 |
读未提交 | 否 | 否 | 否 | 否 | 否 |
读已提交 | 是 | 是 | 否 | 否 | 否 |
可重复读 | 是 | 是 | 是 | 是 | 否 |
串行化 | 是 | 是 | 是 | 是 | 是 |
实战
这里以Mysql为例进行说明,工具使用的是Navicat。
操作之前,我们先来了解几个指令:
查看数据库版本:select version();
查看隔离级别:select @@session.tx_isolation;
修改隔离级别:set @@session.tx_isolation=参数;
可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
开启事务:start transaction;
提交:commit;
回滚:rollback;
我们可以通过使用指令设置Mysql的隔离级别,来验证上述表格中内容是否正确,不过需要说明的是,由于Mysql的锁等内容,可能会导致有些情况无法验证或验证有差异。这里,我设置Mysql的隔离级别为读已提交,验证脏读异常是否存在。
操作步骤:
1)新建一个数据库,命名为代表db1,建一张表,命名为tbook;
CREATE TABLE `tbook` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(45) DEFAULT NULL,`price` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
2)右键数据库db1——命令列界面,这里我打开两个,模拟两个事务;
3)因Mysql默认的隔离级别为可重复读,因此我们需要先设置隔离级别为读已提交,在两个命令列界面中分别设置,同时开启事务:
set @@session.tx_isolation='READ-COMMITTED';
start transaction;
4)模拟脏读异常场景,在tbook表中插入一些数据。看下图效果显示,表明当隔离级别为读已提交,脏读异常不存在:
事务1 | 事务2 |
查询数据得到初始值1 | 查询数据得到初始值1 |
更新数据为2 | 查询数据值仍为1 |
commit | commit |
数据库事务与锁(一)——事务的简单介绍相关推荐
- 浅谈MySQL数据库中的锁与事务
MySQL中的锁与锁策略 在MySQL中,为了应对并发场景下的读写,锁通常分为两类:共享锁以及排他锁.其中,共享锁允许多个连接在同一时间并发的读取相同的资源,彼此之间互不影响,所以又称为读锁.排他锁则 ...
- 深入理解 MySQL ——锁、事务与并发控制
本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结,希望帮助读者能更加深刻地理解 MySQL 中的锁和事务,从而在业务系统开发过程中可以更好地优化与数据库的交互. ...
- 深入理解 MySQL—锁、事务与并发控制
本文转载自"vivo 互联网技术",已获授权. 本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结,希望帮助读者能更加深刻地理解 MySQL 中 ...
- 深入理解 MySQL ——锁、事务与并发控制 1
深入理解 MySQL --锁.事务与并发控制 目录 MySQL 服务器逻辑架构 MySQL 锁 事务 隔离级别 并发控制 与 MVCC MySQL 死锁问题 1.MySQL 服务器逻辑架构 (图片来源 ...
- 元数据解决分表不可 mysql_MySQL InnoDB技术内幕:内存管理、事务和锁
前面有多篇文章介绍过MySQL InnoDB的相关知识,今天我们要更深入一些,看看它们的内部原理和机制是如何实现的. 一.内存管理 我们知道,MySQl是一个存储系统,数据最后都写在磁盘上.我们以前也 ...
- 五、Mysql事务以及锁原理
五.Mysql事务以及锁原理 事务(ACID) 场景:小明向小强转账10元 原子性(Atomicity) 转账操作是一个不可分割的操作,要么转失败,要么转成功,不能存在中间的状态,也就是转了一半的这种 ...
- Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁
1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...
- 第二十二节: 以SQLServer为例介绍数据库自有的锁机制(共享锁、更新锁、排它锁等)和事务隔离级别 :
一. 基本概念 1.共享锁:(holdlock) (1). select的时候会自动加上共享锁,该条语句执行完,共享锁立即释放,与事务是否提交没有关系. (2). 显式通过添加(holdlock)来显 ...
- mysql乐观锁与事务_[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁
注明: 本文转载自http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库 ...
最新文章
- 从 RequireJS 到 SeaJS(2)
- 04-1.jQuery事件与补充each/data
- Neo4j:遍历查询超时
- CentOS 7.0 yum安装Apache、PHP和MySQL
- vb 打开sdf数据_DWG、DGN、SDF、DWF!Civil 3D图形数据共享的几种方法
- IdentityServer4 And AspNetCore.Identity Get AccessToken 问题
- jest单元测试-基础
- 04-新拟物单选按钮样式
- GameSalad:让每个人都变成游戏开发者
- 基于web的网页问卷调查设计_Python3菜鸟教程丨基于Web模块的轻量级接口设计基础...
- 笔记本无线上网卡的种类
- ffmpeg 为取经而来_取经路上的妖魔鬼怪,傻傻分不清楚
- Address localhost:8080 is already in use
- 大工21春《土木工程实验(二)》实验报告
- 期货开户客户经理一对一专业服务指导
- 【现控理论】(一、系统的传递函数矩阵)----学习笔记
- 解决 configure.ac: error: possibly undefined macro: AC_PROG_LIBTOOL
- 尊贵荣耀 诺基亚8系列手机回忆录
- java 地铁费_通过java程序模拟实现地铁票价2+2=12
- ps绘制android手机界面界面,教程·Photoshop | 手机界面效果图展示设计
热门文章
- 树莓派Linux挂载硬盘提示只读问题解决
- PAT日志 1053
- android Math算法
- mysql中的unsigned是什么意思???
- 机器学习数学基础学习笔记
- ActiveMQ问题与调优
- 我的世界java笔刷指令_笔刷-goBrush 插件 | 我的世界 | MC世界侠
- Poj 3208 Apocalypse Someday(数位dp + 二分)
- Cannot currently show the desktop[已解决]
- 国庆服务器维护,9月20日服务器维护公告 中秋国庆活动开启