当前位置: 首页 > article >正文

数据库事务介绍

  1. 事务:

    • 事务主要用来处理操作量大、复杂度高、且关联性强的数据。

    • 譬如人员管理系统,当删除一个人员时,既要删除人员的基本资料,也要删除和改人员相关的信息,如邮箱、文章等,这些数据库操作语句就构成一个事务。

    • 事务处理可以保证数据库的完整性和一致性,成批的sql语句要么全部执行,要么全都不执行,主要针对inssert,update,delete语句而设置。

    • mysql中只有innoDB支持事务。

  2. 事务操作

    2.1、开启事务:start transcation

    • 任何一条DML语句如insert、update、delete的执行就标志着事务的开启
    • 命令:begin或start transcation

    2.2、提交事务:commit transcation

    • 成功的结束,将所有的DML语句操作历史记录和底层硬盘数据进行一次同步
    • 命令:commit

    2.3、回滚事务:rollback transcation

    • 失败的结束,将所有的DML语句操作历史记录全部清空
    • 命令:rollback

    2.4、事务的自动提交

    • 之前的所有sql操作中也有事务,只是mysql自动完成了,每执行一条sql时mysql就自动提交事务

    • 如果需要手动控制事务,需要关闭事务的自动提交

      set autocommit = 0 --禁止自动提交
      set autocommit = 1 --开启自动提交
      

    2.5、示例

    create database if not exists demo_transcation;
    use demo_transcation;
    create table account(
    	car_id int primary key,
    	name varchar(8),
    	money double
    )charset = utf8;
    
    insert into account values(1005,'马云','10000'),(1009,'强东',10000);
    
    --car_id为1的账号给2的账号转账
    set autocommit = 0;  --关闭自动提交
    select @@autocommit; --查看自动提交状态
    
    begin; --开启事务
    update account set money = money - 200 where car_id = 1005;
    update account set money = money + 200 where car_id = 1009;
    commit;  --提交事务
    rollback; --如果执行失败时回滚事务
    
  3. 事务(transaction)的四大特性(ACID):

    3.1 原子性(Atomicity)

    • 事务中的所有操作要么全部完成,要么全都不完成,不会结束在中间任何环节中。
    • 事务在执行过程中发生错误,会被回滚(rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

    3.2 一致性(Consistency)

    • 在事务开始之前和事务结束以后,数据库的完整性没有被破坏;即数据库从一个一致性状态转换到另一个一致性状态。

    3.3 隔离性(iaolation)

    • 并发事务之间相互影响的程度。一个事务所做的修改在最终提交以前,对其他的事务是不可见的,譬如一个事务会不会读取到另一个未提交的事务修改的数据。

    • 事务的隔离级别:

      – read uncommitted读未提交:最低级别,事务A修改了一个数据但未提交,事务B读到了事务A未提交的更新结果,如事务A提交失败,那B读到的就是脏数据。

      – read committed读提交:一个事务要等待另一个事务提交后才能读取数据,可以避免脏读,会造成不可重复读(A事务在提交事务期间读到B事务的数据时不同的)。

      – repeateable read可重复读:在开始读取数据时(事务开启时),不再允许修改操作,可避免脏读、不可重复读,但会幻读(A事务在提交前和提交后读到的数据不一致)。

      – serializable序列化:是最高的事务隔离级别,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但效率低,比较消耗数据库性能,一般不使用。

      – mysql的默认隔离级别为repeateable read

      事务隔离级别脏读不可重复读幻读
      读未提交read uncommittedyesyesyes
      不可重复读read committednoyesyes
      可重复读repeateable readnonoyes
      串行化serializablenonono
    • 事务隔离级别的操作

      --查看事务隔离级别
      show variables like '%isolation%';
      
      --设置隔离级别
      set session transcation isolation level 级别字符串
      
      set session transcation isolation level read uncommitted; --设置为读未提交
      set session transcation isolation level read committed;   --设置为读提交
      set session transcation isolation level repeateable read; --设置为可重复读
      set session transcation isolation level serializable;     --设置为串行化
      

    3.4、持久性(durability)

    • 一旦事务提交(Commit),则其所做的修改将永久保存在数据库中。即使系统发生故障,事务的结果也不会丢失。持久性通常依赖于数据库的日志系统,事务的修改操作会被记录在日志中,以便在系统恢复时能够重放这些操作

http://www.kler.cn/a/397359.html

相关文章:

  • Python教程笔记(2)
  • vue-router的push和replace的区别
  • c++ 类和对象(中)
  • 使用Python实现深度学习模型:智能食品配送优化
  • More effective C++:杂项
  • 软件设计师 - 第1章 计算机网络概论
  • 20241112-Pycharm使用托管的Anaconda的Jupyter Notebook
  • 周末总结(2024/11/16)
  • AJAX学习(24.11.1-24.11.14)(包含HTTP协议)
  • 管家婆工贸ERP BR039.采购订单关联MRP明细表
  • Blossom:开源私有部署的markdown笔记软件
  • Jarvis March算法详解及Python实现(附设计模式案例)
  • Rust 语言学习笔记(五)
  • 细粒度集群
  • Electron教程2-第一个应用
  • 在k8s上部署minio
  • 企业网络链路聚合、数据抓包、远程连接访问实验
  • Linux基础开发工具使用
  • linux病毒编写+vim shell编程
  • 微软出品的一个鼠标控制多台电脑,还能共享剪切板分享与下载
  • 微信小程序:vant组件库安装步骤
  • Django中的URL配置与动态参数传递(多种方法比较)
  • 深入探索 Kubernetes 安全容器:Kata Containers 与 gVisor
  • Jmeter中的监听器(二)
  • 【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-奇数序列排序
  • 【C语言】实现二维数组按行排序