首页 > 数据库 >mysql系列之事务(三)

mysql系列之事务(三)

时间:2024-08-08 22:06:18浏览次数:14  
标签:事务 系列 隔离 要么 提交 mysql 一致性 数据

1.为什么需要事务

  首先我们要知道什么是事务:事务(Transaction)是‌数据库系统中执行的一个工作单位,它是由用户定义的一组操作序列。一个事务可以是一组‌SQL语句、一条SQL语句或整个程序,一个应用程序可以包括多个事务。

  通俗易懂来说就是,我们在执行一个操作时,要保证要么都成功,要么都不成功。一个比较经典的案例就是:比如我们在发起转账时,A转给B1000元,这个操作其实至少要分为两步:1.A账户余额减少1000,2.B账户增加1000 ,如何保证呢,那就得用到事务的特性(要么1,2都成功,要么1,2都不成功),保证最终数据一致。那么具体怎么实现,我们接下来详细介绍:

2.事务特性

  事务具有四大属性:原子性,一致性,持久性,隔离性,下面分别介绍一下四大属性的含义:

  原子性:原子性是指一个操作或一组操作要么全部执行成功,要么全部不执行,不会出现部分执行的情况。就像上面的案例,A扣了1000元和B加了1000元,要么都成功,要么都失败。原子性一定程度上保证了数据的一致性。原子性不仅在事务中占有很重要的地位,我们在学习并发编程的时候,会认识到原子性的重要性。

  一致性:事务一致性是指事务将数据库从一种一致性转换到另外一种一致性状态,在事务开始之前和事务结束之后数据库中数据的完整性没有被破坏。你发现其实和原子性是比较类似的,一致性更侧重于数据层面的约束,原子性更侧重于操作层面的约束,两者结合其实基本可以满足事务的要求,但对于数据库来说还不够。

  持久性:持久性确保一旦事务被提交,其结果将永久保存在数据库中,即使发生系统故障或重启,也不会丢失。

  隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

对于持久性和隔离性来说,更多算是对于事务实现的补充,但反而,我们要付出的代价更大。(ps:我其实在平时的程序设计及代码编写过程中很喜欢这个词,任何需要我为止付出性能上的牺牲,工作量的牺牲,我都称之为代价,我喜欢超前思考,但从不主动设计复杂程序,我更主张写出让人看得懂的“很low“的代码,流畅运行的代码,如果没有说服我的理由,我不会付出代价,带来的好处就是上线问题少很多)。其实在程序设计中也是如此,我们可能就是为了保证那极少数人的变态操作才会将程序设计的如此复杂。以前的时候我很喜欢扣这些细节,然后死磕如何使用代码去“优雅的”解决这些变态问题,慢慢的我会使用一些业务手段规避,其实也就是代价考量的问题。扯远了,接着说回事务:

3.事务并发的一些问题以及如何解决

  理想化的事务执行肯定是排队,但是排队的话效率太慢了,我们又想要事务之间有一定的隔离性,但又想能快点执行,会怎么样呢?或者换个角度问:当我们舍弃一单的隔离性后,会出现什么样的问题呢:

  1.脏读:一个事务读到另一个事务的尚未提交的数据

  2.不可重复读:事务连续检索两次相同记录的数据,读到的值不一样

  3.幻读; 事务A重复执行select(条件相同)语句时,查到了新的记录 

幻读和不可重复读都是读到数据变化了,但不可重复读侧重于已读到过的数据发生了变化(比如值变大变小,数据被删除),而幻读侧重于读到了之前没有的记录。

好,知道了会出现的问题,那么怎么解决呢: 通过事务隔离级别。

接下里我们就详细介绍一下事务隔离级别:

事务隔离级别分为以下四种:

  READ UNCOMMITTED:未提交读。其实基本没啥限制,可以读到其他事务未提交的数据。所以没啥隔离性,一个问题都没解决。

  READ COMMITTED:已提交读。相较未提交读,读不到未提交的数据,但可以读到其他事务已提交的数据,所以还是可能会有不可重复读的问题

  REPEATABLE READ:可重复读。事务提交前不会读到当前事务之后提交的事务的数据,这个后面详细介绍,涉及到MVCC以及如何解决不可重复读、幻读问题。

  SERIALIZABLE:可串行化。其实就是串行化执行了,可想而知,互联网环境下基本都不会用到。

 这篇我们主要了解了一下事务是什么,用来做什么,事务的特性以及常规会出现的问题及对这些问题的处理。下一篇我们聊聊mysql对事务的实现以及解决这些问题的实现原理。

标签:事务,系列,隔离,要么,提交,mysql,一致性,数据
From: https://www.cnblogs.com/gmt-hao/p/18347925

相关文章

  • 没闲着系列 22
    最近下班后,时间还是比较宽松的,相对宽松。今天更新一下TaskSaas近期有什么变动:一个就是概览dashboard以及需求、问题的选择中,加入了ALLTODODONE的分类,更便于查询全部、待做(新建、重新打开、进行中、待反馈)、已完成的分类。第二个是修复了工作台里的一系列bug。因为之前问题......
  • mysql在软件实施中常用到的语句
    MySQL在软件实施中常用到的语句非常广泛,涵盖了数据定义(DDL)、数据操纵(DML)、数据查询(DQL)和数据控制(DCL)等多个方面。以下是一些常用的MySQL语句及其用途,这里列举了一部分:1.数据定义语言(DDL)创建数据库CREATEDATABASE数据库名称;//创建一个新的数据库。CREATEDATABASEI......
  • 用Python简单操作MySQL!轻松实现数据读写
    PyMySQL是Python编程语言中的一个第三方模块,它可以让Python程序连接到MySQL数据库并进行数据操作。它的使用非常简单,只需要安装PyMySQL模块,然后按照一定的步骤连接到MySQL数据库即可。本文将介绍PyMySQL的安装、连接MySQL数据库、创建表、插入数据、查询数据、更新数据和删除数据......
  • MySQL高级——MySQL储存引擎
    一、概念1)数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。2)不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。3)用户可......
  • MySQL——数据库的设计、事务、视图
    文章目录数据库的设计1.多表之间的关系2.实现关系3.数据库设计的范式事务1.事务的基本介绍2.事务的四大特征ACID3.事务的隔离级别(了解即可)视图1.什么是视图?2.视图创建及使用方法3.注意事项4.为什么使用视图数据库的设计1.多表之间的关系一对一(了解)如:人和身份证......
  • 面试官:说说MySQL调优?
    MySQL作为关系型数据库的典型代表,其流行程度超越于任何数据库,因此在Java面试中,MySQL是一定会被问到的重要知识点。而在MySQL中有一道极其常见的面试题,我们这里系统的来看一下,这就是我们今天要讨论的MySQL调优问题。MySQL调优的大体思路如下:具体调优思路如下。1.查询......
  • ignite系列之20-数据源扩展GaussDB
    其它内容参见ignite系列之19-数据源扩展Postgresql publicStringloadCacheSelectRangeQuery(StringfullTblName,Collection<String>keyCols){Stringcols=mkString(keyCols,",");Stringcondition=DataSourceUtils.getCondition(fullTblName);ret......
  • 【原创】java+swing+mysql教材管理系统设计与实现
    个人主页:程序员杨工个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战开发背景:随着高校教育的发展,学校规模越来越大,管理任务也越来越复杂。教材管理作为高校管理中的重要一环,其复杂性......
  • YOLO系列:从yolov1至yolov8的进阶之路 持续更新中
    一、基本概念1.YOLO简介YOLO(YouOnlyLookOnce):是一种基于深度神经网络的对象识别和定位算法,其最大的特点是运行速度很快,可以用于实时系统。2.目标检测算法RCNN:该系列算法实现主要为两个步骤:先从图片中搜索出一些可能存在对象的候选区(SelectiveSearch),大概2000个左右;然后......
  • MySQL 常见日志清理策略
    前言:MySQL数据库服务器使用多种类型的日志来记录操作和事件,这对于故障诊断、审计和性能分析非常重要。然而,这些日志文件会随着时间的推移而不断增长,可能会占用大量的磁盘空间。因此,定期清理这些日志是必要的,本篇文章我们一起来学习下如何清理MySQL中的日志文件。二进制日志(......