首页 > 数据库 >MySql事务

MySql事务

时间:2024-06-13 11:14:01浏览次数:16  
标签:事务 账户 数据库 用户 MySql 一致性 操作

事务的定义


事务(Transaction)是一个逻辑上完整的操作序列,它包含了一组数据库操作命令。这些操作要么全部执行成功,要么全部不执行,以此来维护数据库的一致性和完整性。事务的主要目的是确保数据的准确性,即使在出现错误或系统故障时也是如此。

事务的应用场景

  • 金融交易:银行转账是最典型的事务应用场景之一,确保从一个账户扣除金额的同时,另一账户能相应增加金额,且整个过程不会因故障中断而导致资金丢失或重复记账。
  • 库存管理:在线购物平台中,当用户下单购买商品时,系统需要确保库存减少和订单创建这两个操作作为一个整体执行,避免超卖或库存错误。
  • 航空订票系统:机票预订过程中,座位的锁定和付款的确认必须作为一个不可分割的事务处理,以防止座位被重复预订。
  • 酒店预订:确保房间预订和支付过程的完整性,避免房间被重复预定或支付后未保留房间的情况。

事务的四大特性

  • 原子性,Atomicty,也就是我们刚才说的不可再分,也就意味着我们对数据库的一系列的操作,要么都是成功,要么都是失败,不可能出现部分成功或者部分失败的情况。以转账的场景为例,一个账户的余额减少,对应一个账户的增加,这两个一定是同时成功或者同时失败的。
    全部成功比较简单,问题是如果前面一个操作已经成功了,后面的操作失败了,怎么让它全部失败呢?这个时候我们必须要回滚
    原子性,在 **InnoDB **里面是通过 undo log 来实现的,它记录了数据修改之前的值(逻辑日志),一旦发生异常,就可以用 undo log 来实现回滚操作。

  • 一致性(Consisent) 事务的一致性是指在数据库管理系统中,事务的执行应当保证从一个一致性的状态转变为另一个一致性的状态。具体来说,这要求在事务开始之前和结束之后,数据库都保持着某种定义好的完整性约束和业务规则,确保数据的准确性和可靠性。
    例如现在,用户A要向用户B转账100元。这个操作需要保持数据库的一致性,具体步骤可以分为以下几个事务内的操作:
    1 开始事务:首先,数据库系统标记一个新事务的开始。
    2 检查余额:系统检查用户A的账户余额是否足够进行这次转账。如果用户A的余额小于100元,则事务应该被回滚,以保持账户余额的准确性(一致性)。
    3 扣款:如果用户A的余额足够,系统从用户A的账户中减去100元,并准备记录这一变化。
    4 存款:同时,系统给用户B的账户增加100元。
    5 记录交易:在Transactions表中添加一条新的交易记录,详细说明这次转账的信息。
    6 提交事务:所有上述操作完成后,如果没有发生任何错误(比如并发事务导致的冲突),事务被提交。这时,用户A的余额减少和用户B的余额增加以及交易记录的创建都永久地保存到数据库中,整个数据库状态保持一致,即账户的总金额没有因为这次转账而改变,只是在不同账户之间重新分配。
    7 事务失败处理:如果在执行上述任何一步骤时出现问题(比如系统崩溃),事务管理器会自动回滚事务,确保数据不被破坏,维持在事务开始前的一致状态。

  • 隔离性,?

  • 持久性,Durable,事务的持久性是什么意思呢?我们对数据库的任意的操作,增删改,只要事务提交成功,那么结果就是永久性的,不可能因为我们系统宕机或者重启了数据库的服务器,它又恢复到原来的状态了。这个就是事务的持久性。

事务的开启和提交

  • 自动开启和提交:执行这样一条更新语句的时候,它有事务吗?
    update student set name = '猫老公 11' where id=1;
    事实上,它自动开启了一个事务,并且提交了,所以最终写入了磁盘。
    这个是开启事务的第一种方式,自动开启和自动提交。
  • 手动开启提交:todo

事务并发带来的问题

有很多人同时去操作数据库的同一张表,A更新了第一条数据,B准备读第一条数据,那么B读到的数据应该是A修改之前的数据还是A修改之后的数据?

引申出来的三个问题

  • 脏读:
  • 不可重复读:
  • 幻读:
引申出数据库的隔离机制

标签:事务,账户,数据库,用户,MySql,一致性,操作
From: https://www.cnblogs.com/grace-yan/p/18245495

相关文章

  • mysql的jdbc连接java实现
    在Java中使用JDBC连接MySQL数据库,你需要以下步骤:确保你有MySQLJDBC驱动程序。如果没有,你可以添加依赖到你的项目中,例如使用Maven:<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></de......
  • Springboot计算机毕业设计影院订票选座微信小程序【附源码】开题+论文+mysql+程序+部
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着移动互联网的快速发展,人们的生活方式发生了深刻变化,特别是在娱乐消费领域。电影院作为重要的文化娱乐场所,其订票方式也逐渐从传统的线下购票转向......
  • Springboot计算机毕业设计影院购票微信小程序【附源码】开题+论文+mysql+程序+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今数字化时代,移动互联网的普及率日益提升,智能手机成为人们生活中不可或缺的工具。微信小程序,作为一种轻量级应用,凭借其便捷性和易用性,受到了广大......
  • Springboot计算机毕业设计英语学习课程微信小程序【附源码】开题+论文+mysql+程序+部
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着移动互联网的迅猛发展,微信已成为人们生活中不可或缺的一部分。微信小程序作为微信生态系统的重要组成部分,以其便捷性、即用即走的特点,受到了广大......
  • Springboot计算机毕业设计英语学习小程序【附源码】开题+论文+mysql+程序+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在全球化的大背景下,英语作为国际通用语言,其重要性不言而喻。然而,传统的英语学习方式往往受到时间、地点和资源的限制,使得学习者难以获得高效、便捷的......
  • nginx代理mysql
    之前服务器单体架构mysql是直接安装在服务器的,没有买托管,这就造成一个问题,如果想要远程连接mysql就要开启3306防火墙端口,全是恶意ip进行攻击。。。。nginx的stream模块可以有效限制远程ip访问stream{server{listen13306;#需要开启云服务器防火墙#allo......
  • Java学习 - MySQL数据增删更清操作 实例
    INSERTINTO-插入语法1-【常用;支持多行;可用于子查询】INSERTINTO表名(字段列表)VALUES(字段值列表),(字段值列表),(字段值列表),(字段值列表);注意如果想设置空值,可以用NULL表示字段列表和字段值列表必须一一对应字段列表的顺序可以和表定义顺序不同可以省略......
  • Java学习 - MySQL数据库常用命令 实例
    进入MySQL命令行>>mysql-u用户名-p>>输入密码查看MySQL的版本--方法1:通过命令行>>mysql--version>>mysql-V--方法2:通过MySql内置函数>>SELECTVERSION();查看所有的数据库SHOWDATABASES;打开指定的数据库USEtables;查看当前数据库所有的表......
  • Java学习 - MySQL数据库导入和查询方式 实例
    目录练习用数据库导入基础查询条件查询排序查练习用数据库导入下载相关资源中的myemployess.sql执行sql脚本sourcemyemployees.sql;基础查询SELECT子句SELECT查询字段FROM表名;--查询字段包括:表的字段,常量值,表达式,函数--查询的结果是一个虚拟的表查......
  • 在 Wed 中应用 MyBatis(同时使用MVC架构模式,以及ThreadLocal 事务控制)
    1.在Wed中应用MyBatis(同时使用MVC架构模式,以及ThreadLocal事务控制)@目录1.在Wed中应用MyBatis(同时使用MVC架构模式,以及ThreadLocal事务控制)2.实现步骤:1.第一步:环境搭建2.第二步:前端页面index.html3.第三步:创建pojo包、service包、dao包、web包、utils包,exceptions......