首页 > 数据库 >MySQL学习(12)事务.md

MySQL学习(12)事务.md

时间:2023-11-07 15:57:55浏览次数:36  
标签:语句 md 事务 12 数据库 提交 MySQL balance 隐式

前言

“古之欲正世调天下者,必先观国政,料事务,察民俗。“出自《管子·正世》,事务就是指要做的或所做的事情。

一件事情要么做了,要么没做,才符合原则。转账不存在转了一半,也不存在我转给你10元,你却到账5元。

ACID原则

原子性(Atomicity)

事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。在现实世界里,转账是一个不可分割的操作。如果在执行过程中发生了错误,就要恢复到执行之前的样子。

一致性(Consistency)

事务的执行不能破坏数据库数据的完整性和一致性,同时也要保证数据库中的数据符合现实世界的约束。一致性指数据满足所有数据库的条件,比如字段约束、外键约束、触发器等,事务从一致性开始,以一致性结束。更多的要求需要靠业务代码保证。

隔离性(Isolation)

事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务是透明的。

持久性(Durability)

对于提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

注:DBMS一般采用日志来保证事务的原子性、一致性和持久性。

事务的概念

在数据库管理系统中,事务是单个逻辑或工作单元,有时由多个操作组成,在数据库中以一致模式完成的逻辑处理称为事务。一个例子是从一个银行账户转账到另一个账户:完整的交易需要减去从一个账户转账的金额,然后将相同的金额添加到另一个账户。

事务其实是一个抽象的概念,MySQL把需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称为事务。事务执行的过程中分为不同的阶段。

  • 活动的(active)

事务对应的数据库操作正在执行过程中。

  • 部分提交的(partially committed)

事务中的操作已经全部执行完,但未保存到磁盘。

  • 失败的(failed)

事务处于活动状态或部分提交的状态,遇到了程序错误或机器故障而无法继续执行,或者人为中止事务。

  • 中止的(aborted)

处于失败的状态的事务,撤销事务对当前数据库造成的影响,执行完回滚后的状态。

  • 提交的(committed)

处于部分提交的状态的事务完成了刷盘后,就是提交的状态。

事务的状态转换图

注意:只有当事务处于提交的或者中止的状态时,一个事务的生命周期才算结束。提交的事务对数据库所做的修改将永久生效;中止的事务对数据库做的修改都会被回滚到没执行该事务前的状态。

MySQL中如何使用事务

开启事务

使用下面这两种写法都可以显式的开启事务,然后在后续写入需要对数据进行操作的语句。

  • BEGIN

BEGIN;
UPDATE ......
DELETE ......

 

  • START TRANSACTION

    • READ ONLY:表示当前事务是一个只读事务

    • READ WRITE:表示当前事务是一个读写事务

    • WITH CONSISTENCY SNAPSHOT:启动一致性读

START TRANSACTION;
UPDATE ......
DELETE ......

 



START TRANSACTION READ ONLY;
SELECT .....

 

 

实例:

CREATE TABLE account (
  id INT NOT NULL AUTO_INCREMENT COMMENT '自增id',
  name VARCHAR(100) COMMENT '客户名称',
  balance INT COMMENT '余额',
  PRIMARY KEY (id)
); Engine=InnoDB CHARSET=utf8;
INSERT INTO account (name, balance) VALUES ('张三', 11);
INSERT INTO account (name, balance) VALUES ('李四', 2);
CREATE TABLE account (
  id INT NOT NULL AUTO_INCREMENT COMMENT '自增id',
  name VARCHAR(100) COMMENT '客户名称',
  balance INT COMMENT '余额',
  PRIMARY KEY (id),
  CHECK (balance >= 0)
); Engine=InnoDB CHARSET=utf8;
 

SELECT * FROM account;
BEGIN;
UPDATE account SET balance = balance - 1 WHERE id = 1;
UPDATE account SET balance = balance + 1 WHERE id = 2;
COMMIT;
SELECT * FROM account;

 

提交事务

当最后一条语句写完后,就可以提交这个事务了。

手动提交

使用COMMIT提交事务。

BEGIN;
UPDATE ......
DELETE ......
COMMIT;

 

自动提交

系统变量autocommit可以设置是否自动提交事务。它的默认值是ON,也就是默认情况下,如果不显示地开启事务,MySQL认为每一条语句都是一个独立的事务,这种事务自动开启,自动提交;若把autocommit设置为OFF,或显式开起事务,则必须手动提交或回滚事务,不会自动提交。

SHOW VARIABLES LIKE 'autocommit';

 

image-20231107121618773

隐式提交

当显式的开启事务后,会因为一些特殊的语句导致事务提交,这种情况叫做隐式提交。

  • DDL语言

使用CREATE、ALTER、DROP等语句操作数据库对象时,会隐式地自动提交前面语句的事务。

  • 隐式使用或修改mysql数据库中的表

使用ALTER USER、CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD等语句时,会隐式地自动提交前面语句的事务。

  • 事务控制或关于锁定的语句

当一个事务还没有提交或回滚,又使用BEGIN或START TRANSACTION开启一个新的事务,就会隐式地自动提交前面语句的事务。

使用LOCK TABLES、UNLOCK TABLES等语句也会隐式地自动提交前面语句的事务。

  • 加载数据的语句

使用LOAD DATA语句想数据库中批量导入数据时,会隐式地自动提交前面语句的事务。

  • 复制的语句

使用START SLAVE、STOP SLAVE、RESET SLAVE、CHANGE MASTER TO等语句时,会隐式地自动提交前面语句的事务。

  • 其他

ANALYZE TABLE、CACHE INDEX、CHECK TABLE、FLUSH、LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE、RESET等。

中止事务

手动中止

在已开启的事务中,使用ROLLBACK语句让数据库状态恢复到事务执行之前的样子。

BEGIN;
UPDATE ......;
ROLLBACK;

 

注意:ROLLBACK是手动调用来回滚事务。

错误中止

执行过程中遇到程序错误而无法继续执行,会回滚失败的语句,在某些情况下可能会回滚整个事务。

保存点

使用ROLLBACK不仅可以回滚整个事务,还可以对事务设置保存点,让ROLLBACK回滚到指定的保存点。

定义保存点的语法:

SAVEPOINT sp_name;

 

想回滚到保存点这样即可:

ROLLBACK TO sp_name;

 

删除保存点:

RELEASE SAVEPOINT sp_name;

 

 

标签:语句,md,事务,12,数据库,提交,MySQL,balance,隐式
From: https://www.cnblogs.com/haleyeung/p/17815149.html

相关文章

  • mysql 表级锁之一元数据锁(meta data lock,MDL)
    什么是元数据锁(metadatalock,MDL)在MySQL5.5.3之前,有一个著名的bug#989(bug链接:MySQLBugs:#989:IfDROPTABLEwhilethere’sanactivetransaction,wrongbinlogorder),大致如下:#session1:BEGIN;INSERTINTOt...;COMMIT; #session2:DROPTABLEt; #......
  • selenium等待元素加载,元素操作,执行js,切换选项卡,前进后退,异常处理,登录cnblogs,抽
    1selenium等待元素加载......
  • mysql测试语句创建写入存储过程调用8.0
    --创建表格 CREATETABLEmy_table(idINTAUTO_INCREMENT,nameVARCHAR(255)CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ci,emailVARCHAR(255)CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ci,passwordVARCHAR(255)CHARACTERSETutf8mb4COLL......
  • 云上的RDS mysql长事务kill时间很长怎么解决
    【问题】实例删除大事务之后,kill时间较长,运行中【建议&注意事项】超大事务执行期间被kill。这时候,回滚操作需要对事务执行期间生成的所有新数据版本做回收操作,这种场景耗时会比较长。建议:1.通过影响系统环境,让这个Killed状态尽快结束。比如:临时调大innodb_thread_concurre......
  • 搭载经纬恒润12V BMS的路特斯ELETRE开始量产交付
        近日,搭载经纬恒润12V电池管理系统(BMS)的路特斯ELETRE开始量产交付。该车型是路特斯科技面向全球市场打造的超高端纯电智能跑车。    作为路特斯首款纯电动车型,ELETRE传承了路特斯的赛道DNA,在空气动力学、轻量化等方面都达到了顶级水准。此次合作,经纬恒润提......
  • 浙江大学利用 SVM 优化触觉传感器,盲文识别率达 96.12%
    生物传感是人类与机器、人类与环境、机器与环境交互的重要媒介。其中,触觉能够实现精准的环境感知,帮助使用者与复杂环境交互。为模仿人类的触觉,科研人员开发了各种传感器,以模拟皮肤对环境的感知。然而,触觉传感的要求高、参数变化多样,需要大量的研发经验、充分的文献调研和大量的试错......
  • chapter12-chapter16
    目录chapter12:内中断1.内中断的产生2.中断处理程序3.中断向量表4.中断过程5.中断处理程序和iret指令单步中断chapter13:int指令chapter14:端口1.端口2.shl和shr指令chapter15:外中断1.可屏蔽中断2.不可屏蔽中断3.CPU及时处理外设输入的过程4.PC机键盘的处理过程chapter16:直接定址表1.......
  • 如何避免Mysql的timestamp的大坑
    如何避免Mysql的timestamp的大坑Mysql的timestamp类型讨论需要测试MYSQL的同学,可以点以下链接免费试用腾讯云mysql服务器https://curl.qcloud.com/tgnMO3KJ一.时间戳字段定义timestamp时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起到......
  • linux版本mysql安装
    linux版本mysql安装1先检查有没有安装mariadb,有的话将其卸载,不然会和mysql冲突。yumlist|grepmariadbmariadb-libs.x86_641:[email protected]_641:5.5.68-1.el7basem......
  • 《MySQL》复习必刷知识点
    1.数据库SQL语言的缩写DDL:数据定义语言DataDefinitionLanguage,定义语言就是定义关系模式、删除关系、修改关系模式以及创建数据库中的各种对象,比如表、聚簇、索引、视图、函数、存储过程和触发器关键字包括:Create,Alter,Drop,TruncateDML:数据操纵语言全称是DataManipulationLa......