数据库事务

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

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. Python-求序列长度和序列长度协议-len() __len__

    len() 求序列的长度 print(len("beimenchuixue")) print(len([1, 2, 3])) __len__ 对象中实现这个方法,则 len() 方 ...

  2. Python练习题 013:求解a+aa+aaa……

    [Python练习题 013] 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字.例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入. 这题倒也 ...

  3. js简单数据类型和复杂数据类型

    var timer = null;  //简单数据类型null 返回的是一个空的对象 object console.log(typeof timer); 1.简单数据类型 在内存中存放在栈中,在里面开 ...

  4. 刷LeetCode的简易姿势

    近期抽空刷了刷LeetCode,算是补补课. 由于不是很习惯直接在网页上Coding&Debug,所以还是在本地环境下进行编码调试,觉得基本OK后再在网页上提交. 主要采用Python3进行提 ...

  5. @FeignClient注解详解

    Spring Cloud 是目前最火的微服务框架,Feign 作为基础组件之一,在 Spring Cloud 体系中发挥了重要的作用. 一.FeignClient注解 FeignClient注解被@T ...

  6. python之线程池和进程池

    线程池和进程池 一.池的概念 池是用来保证计算机硬件安全的情况下最大限度的利用计算机 它降低了程序的运行效率但是保证了计算机硬件的安全从而让你写的程序能够正常运行 ''' 无论是开设进程也好还是开设线 ...

  7. intelliJ 软件项目打开运行

    1.导入项目 2.首先更改数据库,找到application-dev.yml文件,更改数据源 3.配置tomcat端口  找到application.yml 文件 然后打开pom.xml 更改版本号 ...

  8. 多测师讲解 自动化测试理论(1)_高级讲师肖sir

    自动化测试理论什么是自动化测试?广义的:通过工具或程序替代或辅助人工测试的行为叫自动化测试狭义的:通过工具录制或编写脚本模拟手工测试的过程,通过回放或运行脚本执行测试用例,从而代替人工对系统的功能验证 ...

  9. 推荐算法之: DeepFM及使用DeepCTR测试

    算法介绍 左边deep network,右边FM,所以叫deepFM 包含两个部分: Part1: FM(Factorization machines),因子分解机部分 在传统的一阶线性回归之上,加了 ...

  10. elk-日志方案--使用Filebeat收集日志并输出到Kafka

      1,Filebeat简介 Filebeat是一个使用Go语言实现的轻量型日志采集器.在微服务体系中他与微服务部署在一起收集微服务产生的日志并推送到ELK. 在我们的架构设计中Kafka负责微服务和 ...