返回顶部
首页 > 资讯 > 数据库 >数据库事务的四大特性以及事务的隔离级别整理
  • 121
分享到

数据库事务的四大特性以及事务的隔离级别整理

数据库事务的四大特性以及事务的隔离级别整理 2016-02-05 22:02:24 121人浏览 无得
摘要

事务的四大特性 原子性(atomicity) 我们经常说,一个事务执行失败了,就得回滚,其实这就是事务的原子性,一个完整事务,要么全部执行成功,如果有一个或者多个失败,那么就要回滚,其实这也是另一个特性即一致性的基础 一致性(

数据库事务的四大特性以及事务的隔离级别整理

事务的四大特性

  • 原子性(atomicity) 我们经常说,一个事务执行失败了,就得回滚,其实这就是事务的原子性,一个完整事务,要么全部执行成功,如果有一个或者多个失败,那么就要回滚,其实这也是另一个特性即一致性的基础
  • 一致性(consistency) 一致性,先举个栗子,最容易理解的栗子,本来刘备有200元,关羽没有钱,那么刘备给关羽转账100元,现在需要两步执行这个操作,先减去刘备账户里面的100元,第二步,给关羽账号增加100元,那么这两步算是一个事务。在事务发生前,关羽0 +刘备200=200元,事务结束后,关羽100+刘备100=200,数据没有平白增加或者减少。而且不管这兄弟俩怎么转,这个总和不会发生变化,这就是事务的一致性。一致性就是说事务必须使用数据库从一个一致性状态变换到另一个一致性状态。想想我们讲的第一个原子性,如果一半成功,一半失败而没有回滚,还会有数据的一致性吗?
  • 隔离性(isolation) 隔离性主要是针对并发访问来讲的,当多个用户修改数据表时,数据库为每一个用户开启的事务,不能被其他的事务干扰,多个并发要互相隔离,即对于同一个资源,在同一个时间段只能有一个事务可以修改
  • 持久性(durability) 持久性就是说一旦事务成功提交,那么对于数据库来说,这种改变是持久的

事务的隔离级别

Mysql中,支持四种隔离级别,即ru,rc,rr,serializealbe,后面我们会一一讲解,mysql默认支持的的rr,

  • 此处给大家推荐一款好用的数据库管理工具,jetbrains出品的datagrip;好用哇哇!,下面的sql语句都是在datagrip中运行的 image.png

  • READ UNCOMMITTED(未提交读)

  • ru是指在一个事务执行未完成的时候,数据对其他事务也是可见的,而且读取的是已经更改但是还没有commit的数据,这种保证不了数据准确的隔离级别几乎是不用的。也正如此,所以它的性能是最优的

    • 创建相关的数据库和数据表
create schema test;
use test;
CREATE TABLE `t` (
                     `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
                     `point` int(11) DEFAULT NULL,
                     PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

  • 下面粘贴sql语句,注意在同一行的代码先左后右执行,是在两个sql窗口执行的,在执行到第6行的时候发现,console2开启了事务,但是还没有commit,但是console1已经查询到未提交的结果了。这就是读未提交 image.png

  • READ COMMITTED(读已提交) 大部分的数据库默认隔离级别就是rc,就是说一个事务只能看见已经提交的修改结果,如果没有提交,那么只能看见原来的结果,而不会看到修改未提交的结果,但是这会出现一个问题,什么问题呢?就是 在一个事务中,如果另一个事务修改了数据并且提交,那么在第一个事务中针对同一个查询,就会查询出来两个不同的数据,即不可重复读 image.png

  • 新增一条如果没有提交也是读取不到的 image.png

  • 这个时候,如果两个窗口同时对一条数据更改会发生什么情况呢?第二条更新命令会一直等第一条命令的提交,未提交就处于等待状态 image.png

  • REPEATABLE READ(可重复读) 可重复读是mysql默认的隔离级别,rr解决了脏读的问题,但是可能会出现幻读,下面先来演示一下幻读的实现

  • 看一下已经解决了读未提交的问题和不可重复读的问题 image.png

  • 幻读其实是解决不可重复读的一个缺点,为什么?首先事务1已经执行了一个插入操作,新增id3,但是为了可重复读,事务2看不到新增的数据,所以当事务2增加id3的时候报错,因为id3在数据表中已经切切实实的存在了。可重复读,有点像把某一个时刻的数据作为快照写入了缓存,在commit之前所有的读取都是源自缓存,而非真实的表 image.png

SERIALIZABLE(可串行化)

其实我们可以先自己想一下,如何在解决重复读的时候还能解决幻读呢?是不是感觉有点不可能,既然不幻读,那就实现不了可重复读,然鹅,但是,前面的操作都是基于两个事务,但是如我们把两个事务再关联一下呢,是不是就可以解决了,这就是串行的意思,可串行化解决了脏读,幻读,可重复读等问题,但是,势必会影响效率,"可串行化"会在读取的每一行数据上都加,所以可能会导致大量的锁等待和超时问题,所以在实际的生产环境中也很少会用到这个隔离级别,只有在非常需要确保数据的一致性切可以接受没有并发的情况下,才会考虑使用这个隔离级别。

  • 演示一下,先看一下目前的情况 image.png
    • 怎么实现串行化呢,说起来有点恶心,这次不是缓存快照了,让你读实时数据,但是更新操作我给你停了。我让你等到没有事务了,或者其他事务都提交了,才让你这个写操作执行,嗯,就是这样。感觉有点不太高明 image.png
  • 用了锁,有人读也上锁,有人写也上锁,效率能没有影响吗,写之前先看有没有读锁,有读锁就等待。这种方式就是 简单,粗暴 image.png
  • 综合下来,还是看使用的业务场景选择不同的隔离级别,个人感觉大部分业务还是用rc比较好。你觉得呢? 附sql脚本 console1.sql
use test;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
#READ UNCOMMITTED(未提交读)
start transaction ;
select * from t where id =1;
update t set point=50 where id =1;
commit ;
#READ COMMITTED(读已提交)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
select * from t where id =1;
start transaction ;
update t set point=80 where id =1;
insert into t values (null,200);
select * from t where id =2;
commit ;

#REPEATABLE READ(可重复读)
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
select * from t ;
start transaction ;
update t set point=100 where id=1;
commit ;

start transaction ;
select * from t ;
insert into t values (null,300);
select * from t ;
commit


## SERIALIZABLE(可串行化)
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE ;
start transaction ;
select * from t;
insert into t values (null,123);

console2.sql

use test;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
#READ UNCOMMITTED(未提交读)
start transaction ;
select * from t where id =1;
select * from t where id =1;
commit ;
#READ COMMITTED(读已提交)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
select * from t where id =1;
start transaction ;
update t set point=10 where id =1;
select * from t where id =1;
select * from t where id =2;
commit ;

#REPEATABLE READ(可重复读)
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
select * from t ;
start transaction ;
select * from t where id=1;
select * from t where id=1;

start transaction ;
select * from t ;
select * from t ;
insert into t values (3,300);
commit


## SERIALIZABLE(可串行化)
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE ;
start transaction ;
select * from t;
commit;

本篇文章由一文多发平台ArtiPub自动发布
您可能感兴趣的文档:

--结束END--

本文标题: 数据库事务的四大特性以及事务的隔离级别整理

本文链接: https://lsjlt.com/news/7569.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 数据库事务的四大特性以及事务的隔离级别整理
    事务的四大特性 原子性(atomicity) 我们经常说,一个事务执行失败了,就得回滚,其实这就是事务的原子性,一个完整事务,要么全部执行成功,如果有一个或者多个失败,那么就要回滚,其实这也是另一个特性即一致性的基础 一致性(...
    99+
    2016-02-05
    数据库事务的四大特性以及事务的隔离级别整理
  • 数据库事务的四大特性以及事务的隔离级别
    四大特性 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: 原子性(Atomicity)   原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果...
    99+
    2022-01-10
    数据库事务的四大特性以及事务的隔离级别
  • 数据库事务的四大特性和隔离级别
    数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么全部执行,要么全部都不执行。一个逻辑工作单元要成为事务,必须满足事务的四大特性(ACID)。即原子性(...
    99+
    2024-04-02
  • 数据库事务的四大特性及事务的隔离级别是什么
    本篇内容主要讲解“数据库事务的四大特性及事务的隔离级别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“数据库事务的四大特性及事务的隔离级别是什么”吧!如果一...
    99+
    2024-04-02
  • mysql数据库事务及隔离级别
    事务的四大特性: 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的; 隔离性: 并发访问数据库时,一个用户的事务...
    99+
    2021-09-18
    mysql数据库事务及隔离级别
  • 数据库事务的隔离级别
    数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。下面通过事...
    99+
    2014-06-29
    数据库事务的隔离级别 数据库入门 数据库基础教程 数据库 mysql
  • 数据库事务隔离的级别
    本篇内容介绍了“数据库事务隔离的级别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 概述与背景这是数据库...
    99+
    2024-04-02
  • 【MySQL】事务及其隔离性/隔离级别
    需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云-->阿里云-->华为云 show variables like 'autocommit';+---------------+-------+| Variable_name...
    99+
    2023-09-01
    mysql 数据库
  • 事务——什么是事务,事务的特性,事务的隔离级别
    一、什么是事务         事务就是用户定义的一系列操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。 典型场景:银行转账 A 转账100元给B,A账户减少100元,B账户增加1...
    99+
    2023-09-14
    数据库 java 开发语言
  • MySQL的四种事务隔离级别
      环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一、事务的基本要素(ACID) 1.原子性(Atomicity): 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中...
    99+
    2016-09-03
    MySQL的四种事务隔离级别
  • mysql数据库四种事务隔离级别是什么
    这篇文章主要介绍了mysql数据库四种事务隔离级别是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。熟悉 mysql 数据库四种事务隔离级别:...
    99+
    2024-04-02
  • 数据库的事务隔离级别怎么理解
    本篇内容主要讲解“数据库的事务隔离级别怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“数据库的事务隔离级别怎么理解”吧!在MVCC并发控制中,读操作可以分...
    99+
    2024-04-02
  • MySQL事务的概念以及事务隔离级别介绍
    本篇内容主要讲解“MySQL事务的概念以及事务隔离级别介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL事务的概念以及事务隔离级别介绍”吧!先简单介绍...
    99+
    2024-04-02
  • 数据库事务:ACID 和隔离级别
    一、什么是事务 事务是将多条 SQL 作为一个整体进行数据操作。这样能确保全部执行成功或全部执行失败,不改变任何数据。根据业务需求选择不同的存储引擎。对于那些不需要事务的查询类应用,选择非事务型的存储引擎能得到更高的性能,LOCK TABL...
    99+
    2016-06-16
    数据库事务:ACID 和隔离级别
  • 数据库事务隔离级别:为你的数据库选择合适的隔离级别
    什么是数据库事务隔离级别 数据库事务隔离级别是指,在数据库系统中,当多个事务同时访问和修改数据时,为了保证数据的一致性和完整性,而采取的隔离机制。事务隔离级别决定了一个事务在什么情况下可以看到其他并发事务对数据库的修改。 事务隔离级别的类...
    99+
    2024-02-10
    数据库 事务 隔离级别 并发访问 数据完整性 一致性
  • 粗谈MySQL事务的特性和隔离级别
    网上对于此类的文章已经十分饱和了,那还写的原因很简单——作为自己的理解笔记。 前言 ​  此篇文章作为自己学习MySQL的一些个人理解,使用的引擎是InnoDb。首先先讲讲事务的概念,在《高性能MySQL》第三版中其对事务的描...
    99+
    2014-10-16
    粗谈MySQL事务的特性和隔离级别
  • 聊聊MySQL事务的特性和隔离级别
    网上对于此类的文章已经十分饱和了,那还写的原因很简单——作为自己的理解笔记。 前言   此篇文章作为自己学习MySQL的一些个人理解,使用的引擎是InnoDb。首先先讲讲事务的概念,在《高性能...
    99+
    2022-05-11
    MySQL 事务 MySQL 事务特性 MySQL 事务隔离级别
  • MySQL中的事务、4大特性、隔离级别是什么
    本篇内容主要讲解“MySQL中的事务、4大特性、隔离级别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL中的事务、4大特性、隔离级别是什么”吧!本...
    99+
    2024-04-02
  • 数据库事务隔离级别是什么
    这篇文章主要介绍了数据库事务隔离级别是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。数据库事务隔离级别:1、Read Uncommitt...
    99+
    2024-04-02
  • 真正理解Mysql的四种事务隔离级别
    什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。 事务的结束有两种,当事务中的所以步骤全...
    99+
    2015-09-02
    真正理解Mysql的四种事务隔离级别
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作