首页 > 数据库 >事务全攻略,MySQL数据库必学知识!

事务全攻略,MySQL数据库必学知识!

时间:2023-06-30 13:34:23浏览次数:48  
标签:语句 转账 事务 MONEY 必学 回滚 全攻略 MySQL 1000

前言

从今天开始, 健哥就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。

全文大约【1707】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富案例及配图视频,让你更好的理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

一. 事务

事务这个概念不太容易理解,所以健哥通过下面一个模拟转账的案例来让各位小伙伴理解事务到底是什么。

1.模拟转账

生活当中转账是转账方账户扣钱,收账方账户加钱。我们用数据库操作来模拟现实转账。

举个栗子:数据库模拟转账。

#A 账户转账给 B 账户 1000 元。
#A 账户减1000 元
UPDATE account SET MONEY = MONEY-1000 WHERE id=1;

#B 账户加 1000 元
UPDATE account SET MONEY = MONEY+1000 WHERE id=2;

上述代码完成了两个账户之间转账的操作。

举个栗子:模拟转账错误。

#A 账户转账给 B 账户 1000 元。
#A 账户减1000 元
UPDATE account SET MONEY = MONEY-1000 WHERE id=1;
#断电、异常、出错...

#B 账户加 1000 元
UPDATE account SET MONEY = MONEY+1000 WHERE id=2;

上述代码在减操作后过程中出现了异常或加钱语句出错,会发现,减钱仍旧是成功的,而加钱失败了!

注意:每条 SQL 语句都是一个独立的操作,一个操作执行完对数据库是永久性的影响。

2. 事务的概念

事务是一个原子操作,是一个最小执行单元。可以由一个或多个SQL语句组成,在同一个事务当中,所有的SQL语句都成功执行时,整个事务成功,有一个SQL语句执行失败,整个事务都执行失败。

各位小伙伴是否理解了呢?那么健哥再做个小小的总结:

事务就是让多个操作形成一个整体,在这个整体中的多个操作要么执行全成功,要么执行全失败。这就是事务的作用。

3. 事务的执行过程

开始过程:连接到数据库,执行一条DML语句。 上一个事务结束后,又输入了一条DML语句,即事务的开始。

结束过程如下:

1).提交:

a.显示提交:commit;

b.隐式提交:一条创建、删除的语句,正常退出(客户端退出连接)。

2).回滚:

a.显示回滚:rollback;

b.隐式回滚:非正常退出(断电、宕机),执行了创建、删除的语句,但是失败了,会为这个无效的语句执行回滚。

4. 事务的原理

数据库会为每一个客户端都维护一个空间独立的缓存区(回滚段),一个事务中所有的增删改语句的执行结果都会缓存在回滚段中,只有当事务中所有SQL语句均正常结束(commit),才会将回滚段中的数据同步到数据库。否则无论因为哪种原因失败,整个事务将回滚(rollback)。

5. 事务的特性

下面健哥给各位小伙伴系统的说一下事务都具有哪些特性和功能。通常叫做ACID原则,因为ACID是由下面四个单词的首字母构成的。

Atomicity(原子性):表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败

Consistency(一致性):表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态

Isolation(隔离性):事务查看数据操作时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。

Durability(持久性):持久性事务完成之后,它对于系统的影响是永久性的。

6. 事务应用

应用环境:基于增删改语句的操作结果(均返回操作后受影响的行数),可通过程序逻辑手动控制事务提交或回滚。

举个栗子:事务完成转账,A账户给B账户转账。

#1.开启事务
START TRANSACTION;|setAutoCommit=0;#禁止自动提交 setAutoCommit=1;#开启自动提交
#2.事务内数据操作语句
UPDATE ACCOUNT SET MONEY = MONEY-1000 WHERE ID = 1;
UPDATE ACCOUNT SET MONEY = MONEY+1000 WHERE ID = 2;
#3.事务内语句都成功了,执行 COMMIT;
COMMIT;
#4.事务内如果出现错误,执行 ROLLBACK;
ROLLBACK;

注意:开启事务后,执行的语句均属于当前事务,成功再执行 COMIIT,失败要进行 ROLLBACK。

二. 结语

健哥在这里对本文核心要点进行总结:

1.事务能够在增删改操作中保证数据的一致性,所以在增删改操作中必须加入事务。

2.各位小伙伴一定要熟练的记住事务的操作过程以及ACID原则,非常重要哦。

如果有其他问题可以在下面留言,看到后会及时答复,谢谢大家。

标签:语句,转账,事务,MONEY,必学,回滚,全攻略,MySQL,1000
From: https://www.cnblogs.com/qian-fen/p/17516478.html

相关文章

  • Oracle与MySQL的最大连接数和超时时间查询与设置
    Oracle--查询最大连接数SELECTVALUEFROMv$parameterWHERENAME='processes';/*IDLE_TIME:限制每个会话所允许的最长连续空闲时间,超过这个时间会话将自动断开。(参数值是一个整数,单位是分钟,UNLIMITED不限制)CONNECT_TIME:限制指定会话的总运行时间限制,超过这个时间会话将......
  • Cubieboard A10 安装Nand系统,配置nginx,php,mysql,samba详细教程
    安装前置条件1.下载win32diskimager-v0.7-binary.zip2.下载debian_wheezy_armhf_v1_mele.zip3.下载cubie_nand_uboot_partition_image.zip4.下载FlashFXP.zip5.下载PanasonicSDFormatter.zip6.下载puttyfile_0.62cn.zip以上文件下载地址:http://pan.baidu.com/s/1i3Ke8gH ......
  • docker部署mysql主从同步
    1. 规划主机ipmaster10.0.0.1slave10.0.0.12. 查看镜像,下载镜像,导入镜像的命令docker imagesdocker pullmysql:5.7dockerload-imysql.tar3. 启动镜像服务 dockerrun-d --namemysql-master -p3306:3306 -eMYSQL_ROOT_PASSWORD=root@1234 mysql:5.7.174. 复......
  • MySQL内存使用率高且不释放问题排查与总结
    一、内存使用率高且不释放问题排查生产环境MySQL5.7数据库告警内存使用率95%。排查MySQL内存占用问题的思路方法可以参考叶老师这篇文章:https://mp.weixin.qq.com/s/VneUUnprxzRGAyQNaKi-7g。TOP命令查看MySQL进程的RES指标,发现内存使用了10.6G,而数据库的innodb_buffer_pool_si......
  • MySQL-增删改语句
    数据库增删改语句原创 Lyle_Tu Linux分布式主任 2023-06-2622:28 发表于福建收录于合集#数据库7个#语句2个#sql5个#服务器15个 插入数据使用INSERT语句可向指定表中插入数据。INSERT语法的基本结构如下:INSERTINTO<table_name>(column_name1,column......
  • mysql-alter语句
    T-SQLAlter语句原创 Lyle_Tu Linux分布式主任 2023-06-2008:21 发表于福建收录于合集#sql5个#linux13个#数据库7个#服务器15个 ALTERTABLE语句用于在已有的表中添加、修改或删除列。 修改数据库常用语句语法格式:ALTERDATABASEdatabase_name{AD......
  • 12 | 为什么我的MySQL会“抖”一下?
    一下内容出自《MySQL实战45讲》12|为什么我的MySQL会“抖”一下?一条SQL语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。看上去,这就像是数据库“抖”了一下。这个时候,MySQL可能是在刷脏页(fl......
  • ubuntu 18.04.1安装mysql8
    sudoaptupdatesudoaptinstallmysql-serversudosystemctlstatusmysqlsudomysqlALTERUSER'root'@'localhost'IDENTIFIEDWITHmysql_native_passwordBY'password';FLUSHPRIVILEGES;createuser'testuser'@......
  • eggjs连接MySQL数据库
     前言:eggjs连接MySQL数据库,我摸索了各种方式。下面这篇文章能正确链上。 我犯过的几个错误:1,config/plugin.js中我填写错误,这是最致命的,导致直接读不到MySQL。官方文档不靠谱,如下所示//config/plugin.jsexports.mysql={  enable:true,  package:'egg-mysql',};......
  • mysql通过表分区来增加数据查询效率
    背景我们mysql是单机,其中有几个表体积会很大,需要做分表来增加查询效率.我们的数据是连续不断入库的,查询条件是一个批次一个批次的查,也可以看做是按时间段查询.思路mysql事件Event:到一定时间把原表改名,加一个后缀,比如user表改为user_1RENAMETABLEdivision_stop_......