首页 > 数据库 >数据库事务

数据库事务

时间:2023-09-30 18:33:57浏览次数:28  
标签:语句 account -- money 数据库 事务

事务概述

现实生活中我们经常会进行银行转账操作,该操作可分为两部分来完成:账户A转出和账户B转入, 只有这两个部分都无误完成才认为转账成功。在数据库中,可通过两条语句完成该转账操作,如果其中任意一条语句出现异常没有正常执行则会导致两个账户的金额不同步造成错误。为了防止上述情况的发生,MySQL中引人了事务。所谓事务就是针对数据库的一组操作(由一条或多条SQL语句组成)进行管控。如果其中任一条语句无法执行,那么所有的语句都不会执行。也就是说,事务中的语句要么都执行,要么都不执行。

在数据库中使用事务时必须先开启事务,代码如下:

START TRANSACTION; 

事务开启之后就可以执行SQL语句,SQL语句执行成功后,需要使用相应语句提交事务,代码如下:

COMMIT;

请注意:平常我们在MySQL中直接书写的SQL语句都是自动提交的它会立即生效;但是,事务中的操作语句都需要使用COMMIT语句手动提交,否则不会生效。

如果不想提交当前事务还可以使用相关语句取消事务(也称回滚),代码如下:

ROLLBACK;

ROLLBACK语句只能针对未提交的事务执行回滚操作,已提交的事务是不能回滚的。

事务入门示例

在此,创建一张account表用于表示账户信息并进行相关操作。

先来看事务的提交,代码如下:

DROP TABLE IF EXISTS account;

-- 创建account表
CREATE TABLE account(
   id INT primary key auto_increment, 
   name VARCHAR(40), 
   money FLOAT
);

-- 向表中插入数据
INSERT INTO account(name, money) VALUES ('A',1000);
INSERT INTO account(name, money) VALUES ('B',1000);

-- 开始事务
START TRANSACTION;
-- 转账
UPDATE account SET money=money-100 WHERE NAME= 'A';
UPDATE account SET money=money+100 WHERE NAME= 'B';
-- 提交事务
COMMIT;

再来看事务的回滚,代码如下:

DROP TABLE IF EXISTS account;

-- 创建account表
CREATE TABLE account(
   id INT primary key auto_increment, 
   name VARCHAR(40), 
   money FLOAT
);

-- 向表中插入数据
INSERT INTO account(name, money) VALUES ('A',1000);
INSERT INTO account(name, money) VALUES ('B',1000);

-- 开始事务
START TRANSACTION;
-- 转账
UPDATE account SET money=money-100 WHERE NAME= 'A';
UPDATE account SET money=money+100 WHERE NAME= 'B';
-- 回滚事务
ROLLBACK;

事务的特性

事务有着非常严格的定义,它必须同时满足4个特性,即:原子性(Atomicity)、一致性 (Consistency)、隔离性(Isolation)、持久性(Durability),简称事务ACID标准。

原子性

事务必须被视为一个不可分割的最小工作单元,只有事务中所有的数据库操作都执行成功才算整个事务执行成功。如果事务中有任何一个SQL语句执行失败,则已经执行成功的SQL语句也必须撤销,数据库的状态退回到执行事务前的状态。

—致性

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

例如:假设用户A和用户B两者的钱加起来一共为3000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还是3000。

隔离性

数据库为每一个用户开启的事务不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。例如:多个用户操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。  

例如:对于任意两个并发的事务T1和T2。从事务T1的角度看来:T2要么在T1开始之前就已经结束,要么T2在T1结束之后才开始。也就是说:每个事务都感觉不到有其它事务在并发地执行。

持久性

事务一旦提交,其所做的修改就会永久保存到数据库中,即使数据库发生故障也不 应该对其有任何影响。需要注意的是,事务的持久性不能做到100%的持久,只能从事务本身的角度来保证永久性,而一些外部原因导致数据库发生故障,如硬盘损坏,那么所提交的数据可能都会丢失。

标签:语句,account,--,money,数据库,事务
From: https://www.cnblogs.com/qizhiwei/p/17738092.html

相关文章

  • 基于weka的数据库挖掘➖聚类方法K-Means算法
    基于weka的数据库挖掘➖聚类方法K-Means算法目标1.掌握k-Means算法的原理和聚类过程2.可以使用k-Means算法实现对给定样本集的聚类。内容1.采用k-Means算法,对给出的15个样本数据进行聚类,聚类簇数可自由调整,最后输出簇数为2、3、5的聚类结果。k-Means初识k-Means算法是一种......
  • 给PG数据库已有表,已存在列添加序列并设置序列当前值为自增列的最大值
    CREATEORREPLACEFUNCTION"public"."add_sequence_to_table"("p_table_name"text,"p_column_name"text)RETURNS"pg_catalog"."void"AS$BODY$DECLAREmax_valueINTEGER;sequence_nametext;B......
  • 【腾讯云生态大会】腾讯云向量数据库
    【腾讯云生态大会】腾讯云向量数据库一、腾讯云向量数据库介绍二、向量数据库的产品规格三、向量数据库关键概念四、向量数据库的使用之新建数据库实例五、向量数据库的初体验六、向量数据库的使用之检索性能压测七、总结个人主页:ζ小菜鸡大家好我是ζ小菜鸡,让我们一起来体验......
  • MySQL数据库操作 Lab1
            实验一MySQL数据库操作实验目的:掌握MySQL安装、配置与登录方法,使用MySQL客户创建数据库及对数据库表完成各种操作实验内容:1、 安装MySQL数据库管理系统,5.7.X(建议5.7.23及以上)或8.X版本都可以。客户端不限。2、 使用MySQL客户端创建数据库,并且在库中按......
  • 一文搞懂MySQL事务隔离级别和实现原理
    什么是事务数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不做,其实不是没做,是可能做了一部分但是只要有一步失败,就要回滚所有操作。MySQL事务都是指在InnoDB引擎下,MyISAM引擎是不支持事务。假设一个网购付款的操作,用户付款后要涉及到订单......
  • 点赞业务分析-数据库结构设计
        ......
  • 高级系统架构师学习(九)数据库系统
    一、数据库概述数据库模式三级模式:外模式:视图模式(也称为概念模式):数据库表内模式:物理文件两层映像:两层映像可以保证数据库中的数据具有较高的逻辑独立性和物理独立性。外模式-模式映像模式-内模式映像物理独立性:即数据库的内模式发生改变时,应用程序不需要改变。......
  • openGauss学习笔记-84 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署服
    openGauss学习笔记-84openGauss数据库管理-内存优化表MOT管理-内存表特性-MOT部署服务器优化:x86通常情况下,数据库由以下组件绑定:CPU:更快的CPU可以加速任何CPU绑定的数据库。磁盘:高速SSD/NVME可加速任何I/O绑定数据库。网络:更快的网络可以加速任何SQL*Net绑定数据库。除以......
  • 7.数据库设计
    没有正儿八经的设计过数据库表结构,这注定是个需要长期更新的一篇文章~朋友推荐了一个工具,设计表还挺好用的:EZDML,有兴趣也可以试试~ 先从登录所需要的表开始吧:用户信息表:存储用户信息。状态信息表:用于管理用户状态或者文章状态。(例如封禁,屏蔽,启用,禁用诸如此类的,目前的想法......
  • QT: 电子商城系统-MYSQL数据库代码
    QT: 第17章【统合实例】电子商城系统MYSQL代码:/*SQLyogUltimatev12.3.2(64bit)MySQL-8.0.11:Database-emarket**********************************************************************//*!40101SETNAMESutf8*/;/*!40101SETSQL_MODE=''*/;/*!40......