前言

最近系统上线了,这两天收到反馈,操作按钮动不了了、删除按钮动不了了等等类似的问题,仔细查看日志错误,提示: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

事务1

事务2

数据库事务与锁(一)——事务的简单介绍相关推荐

  1. 浅谈MySQL数据库中的锁与事务

    MySQL中的锁与锁策略 在MySQL中,为了应对并发场景下的读写,锁通常分为两类:共享锁以及排他锁.其中,共享锁允许多个连接在同一时间并发的读取相同的资源,彼此之间互不影响,所以又称为读锁.排他锁则 ...

  2. 深入理解 MySQL ——锁、事务与并发控制

    本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结,希望帮助读者能更加深刻地理解 MySQL 中的锁和事务,从而在业务系统开发过程中可以更好地优化与数据库的交互. ...

  3. 深入理解 MySQL—锁、事务与并发控制

    本文转载自"vivo 互联网技术",已获授权. 本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结,希望帮助读者能更加深刻地理解 MySQL 中 ...

  4. 深入理解 MySQL ——锁、事务与并发控制 1

    深入理解 MySQL --锁.事务与并发控制 目录 MySQL 服务器逻辑架构 MySQL 锁 事务 隔离级别 并发控制 与 MVCC MySQL 死锁问题 1.MySQL 服务器逻辑架构 (图片来源 ...

  5. 元数据解决分表不可 mysql_MySQL InnoDB技术内幕:内存管理、事务和锁

    前面有多篇文章介绍过MySQL InnoDB的相关知识,今天我们要更深入一些,看看它们的内部原理和机制是如何实现的. 一.内存管理 我们知道,MySQl是一个存储系统,数据最后都写在磁盘上.我们以前也 ...

  6. 五、Mysql事务以及锁原理

    五.Mysql事务以及锁原理 事务(ACID) 场景:小明向小强转账10元 原子性(Atomicity) 转账操作是一个不可分割的操作,要么转失败,要么转成功,不能存在中间的状态,也就是转了一半的这种 ...

  7. Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁

    1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...

  8. 第二十二节: 以SQLServer为例介绍数据库自有的锁机制(共享锁、更新锁、排它锁等)和事务隔离级别 :

    一. 基本概念 1.共享锁:(holdlock) (1). select的时候会自动加上共享锁,该条语句执行完,共享锁立即释放,与事务是否提交没有关系. (2). 显式通过添加(holdlock)来显 ...

  9. mysql乐观锁与事务_[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁

    注明: 本文转载自http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库 ...

最新文章

  1. 从 RequireJS 到 SeaJS(2)
  2. 04-1.jQuery事件与补充each/data
  3. Neo4j:遍历查询超时
  4. CentOS 7.0 yum安装Apache、PHP和MySQL
  5. vb 打开sdf数据_DWG、DGN、SDF、DWF!Civil 3D图形数据共享的几种方法
  6. IdentityServer4 And AspNetCore.Identity Get AccessToken 问题
  7. jest单元测试-基础
  8. 04-新拟物单选按钮样式
  9. GameSalad:让每个人都变成游戏开发者
  10. 基于web的网页问卷调查设计_Python3菜鸟教程丨基于Web模块的轻量级接口设计基础...
  11. 笔记本无线上网卡的种类
  12. ffmpeg 为取经而来_取经路上的妖魔鬼怪,傻傻分不清楚
  13. Address localhost:8080 is already in use
  14. 大工21春《土木工程实验(二)》实验报告
  15. 期货开户客户经理一对一专业服务指导
  16. 【现控理论】(一、系统的传递函数矩阵)----学习笔记
  17. 解决 configure.ac: error: possibly undefined macro: AC_PROG_LIBTOOL
  18. 尊贵荣耀 诺基亚8系列手机回忆录
  19. java 地铁费_通过java程序模拟实现地铁票价2+2=12
  20. ps绘制android手机界面界面,教程·Photoshop | 手机界面效果图展示设计

热门文章

  1. 树莓派Linux挂载硬盘提示只读问题解决
  2. PAT日志 1053
  3. android Math算法
  4. mysql中的unsigned是什么意思???
  5. 机器学习数学基础学习笔记
  6. ActiveMQ问题与调优
  7. 我的世界java笔刷指令_笔刷-goBrush 插件 | 我的世界 | MC世界侠
  8. Poj 3208 Apocalypse Someday(数位dp + 二分)
  9. Cannot currently show the desktop[已解决]
  10. 国庆服务器维护,9月20日服务器维护公告 中秋国庆活动开启