数据库事务

关注公众号“轻松学编程”了解更多。

1、概念

​ 执行批量操作时,这些操作作为一个整体,要么全部成功,要么全部失败。如银行转账,己方扣钱、对方加钱,这两个操作是一个整体,要么全部成功,要么全部失败。

2、四大特性ACID

  1. 原子性(Atomicity)

    • 事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生
  2. 一致性(Consistency)
    • 事务前后,数据关系一致、业务逻辑一致
  3. 隔离性(Isolation)
    • 一个事务所做的修改在最终提交以前,对其他事务是不可见的
  4. 持久性(Duration)
    • 一旦事务提交,则更改是永久的

3、隔离级别

3.1 并发事务带来的问题
  • 脏读:一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的;
  • 不可重复读:在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的(不可重复读对应的是修改,即UPDATE操作);
  • 幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样(幻读问题对应的是插入INSERT操作);
  • 丢失更新: 两个事务同时读取同一条记录,A先修改记录,B也修改记录(B是不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。
3.2 四种级别

数据库的事务隔离级别(TRANSACTION ISOLATION LEVEL)是一个数据库上很基本的一个概念。事务隔离级别的前提是一个多用户、多进程、多线程的并发系统,在这个系统中为了保证数据的一致性和完整性,从而引入了事务隔离级别这个概念,对一个单用户、单线程的应用来说则不存在这个问题。

​ 为了避免上述几种事务之间的影响,可以通过设置不同的隔离级别来进行不同程度的避免。因为高的隔离等级意味着更多的锁,从而牺牲性能。所以这个选项开放给了用户根据具体的需求进行设置。不过默认的隔离级别Read Commited符合了多数的实际需求。

隔离级别 描述 脏读 丢失更新 不可重复读 幻读 并发模型 更新冲突检测
读未提交:Read Uncommited 一个事务可以读取另一个未提交事务的数据 悲观
读已提交:Read commited 一个事务要等另一个事务提交后才能读取数据 悲观
可重复读:Repeatable Read 在开始读取数据(事务开启)时,不再允许修改操作 悲观
序列化:Serializable 最高的事务隔离级别,在该级别下,事务串行化顺序执行 悲观

​ 大多数数据库默认的事务隔离级别是Read committed,比如Sql Server ,OracleMySQL的默认隔离级别是Repeatable read

3.3 编辑隔离级别

1、修改my.ini配置文件

打开服务管理器(运行打开服务的命令services.msc),右键查看MySQL服务的属性找到my.ini所在路径(默认位置:C:\ProgramData\MySQL\MySQL Server 5.7\my.ini)。

在my.ini中设置,在mysqld选项中如下设置 [mysqld] transaction-isolation = READ-COMMITTED

2、命令行

命令行操作

  • select @@global.tx_isolation;
  • select @@tx_isolation;
  • set tx_isolation=‘READ-COMMITTED’;
  • set global tx_isolation=‘REPEATABLE-READ’;

4、几个API

无异常时提交修改:conn.commit()
发生异常时回滚:conn.rollback()
捕获异常时回滚:try ... except...

5、参考资料

  • 并发问题图解:https://blog.csdn.net/shuaihj/article/details/14163713
  • 隔离级别解释:https://blog.csdn.net/csdnxingyuntian/article/details/57081233
  • 隔离级别设置:https://www.cnblogs.com/moss_tan_jun/p/5753327.html

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

mysql处理数据库事务的更多相关文章

  1. 【MySQL】数据库事务深入分析

    一.前言 只有InnoDB引擎支持事务,下边的内容均以InnoDB引擎为默认条件 二.常见的并发问题 1.脏读 一个事务读取了另一个事务未提交的数据 2.不可重复读 一个事务对同一数据的读取结果前后不 ...

  2. 【Mysql】数据库事务,脏读、幻读、不可重复读

    一.什么是数据库事务 数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位.事务由事务开始与事务结束之间 ...

  3. PHP 操作 MySQL 执行数据库事务

    <?php $mysqli=new mysqli();//实例化mysqli $mysqli->connect('localhost','root','admin','test'); if ...

  4. 五分钟详解MySQL并发控制及事务原理

    在如今互联网业务中使用范围最广的数据库无疑还是关系型数据库MySQL,之所以用"还是"这个词,是因为最近几年国内数据库领域也取得了一些长足进步,例如以TIDB.OceanBase等 ...

  5. MySQL 数据库事务与复制

    好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适. 最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类. 结合实际工作中碰到的问题,以寻找答案的方式 ...

  6. MySQL数据库事务剖析

    MySQL数据库事务剖析 事务就是一组原子性的SQL查询,是一个独立的执行单元.事务内的语句,要么全部执行成功,要么全部执行失败. 1.事务的标准特征 一个运行良好的事务处理系统,必须具备原子性.一致 ...

  7. mysql数据库事务详细剖析

    在写之前交代一下背景吧! 做开发也好久了,没怎么整理过知识,现在剖析一下自己对数据库事务的认识,以前用sqlserver,现在转java后又用mysql.oracle.我这块就主要解释一下mysql数 ...

  8. Net Core中数据库事务隔离详解——以Dapper和Mysql为例

    Net Core中数据库事务隔离详解--以Dapper和Mysql为例 事务隔离级别 准备工作 Read uncommitted 读未提交 Read committed 读取提交内容 Repeatab ...

  9. Mysql数据库事务隔离级别

    事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列.事务ACID属性,即原子性(Atomicity).一致性(Consistency ...

随机推荐

  1. NIO 实现简单群聊功能

    服务端: package com.yang.runnable; import java.io.IOException; import java.net.InetSocketAddress; impor ...

  2. spark-2-RDD

    RDD提供了一个抽象的数据架构,我们不必担心底层数据的分布式特性,只需将具体的应用逻辑表达为一系列转换处理,不同RDD之间的转换操作形成依赖关系,可以实现管道化,从而避免了中间结果的存储,大大降低了数 ...

  3. Python练习题 006:输出九九乘法表

    [Python练习题 006] 输出九九乘法表 --------------------------------------------------- 照理这题不难,逻辑关系弄对了就好办,但数学渣的我 ...

  4. iNeuOS工业互联平台,在“智慧”楼宇、园区等领域的应用

    目       录 1.      概述... 1 2.      平台演示... 2 3.      硬件网关... 2 4.      平台接入硬件网关... 4 1.      概述 " ...

  5. 049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句

    049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句 本文知识点:break语句 break语句 break语句前情回顾 1.swi ...

  6. 02 Writing Your First Program 写你的第一个C程序

    Let's print "Hi" 打印输出"Hi" In your first computer program, let's print something ...

  7. matlab中ceil朝正无穷大四舍五入

    来源:https://ww2.mathworks.cn/help/matlab/ref/ceil.html?searchHighlight=ceil&s_tid=doc_srchtitle 本 ...

  8. mysql时间SQL

    生成随机时间 -- 带时分秒 select FROM_UNIXTIME(UNIX_TIMESTAMP('20100101000000')+ROUND(RAND()*(UNIX_TIMESTAMP()- ...

  9. 跨时代的MySQL8.0新特性解读

    目录 MySQL发展历程 MySQL8.0新特性 秒级加列 性能提升 文档数据库 SQL增强 共用表表达式(CTEs) 不可见索引(Invisible Indexes) 降序索引(Descending ...

  10. Linux init 详解(0,1,2,3,4,5,6)

    一.什么是 init init是Linux系统操作中不可缺少的程序之一. 所谓的init进程,它是一个由内核启动的用户级进程. 内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数 ...