欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL 事务

程序员文章站 2022-03-16 08:24:55
...

什么是事务(Transction)呢?

事务(Transaction)是各大单机SQL数据库厂商(Oracle、IBM DB2...)于上世纪80年代提出的一个用于解决“数据并发操作处理的模型”,旨在满足多用户(多进程、多线程)数据操作场景下,依然能保证逻辑的正确执行,状态持久。

事务(Transaction)是一个最小且不可再分的工作单元,一个事务对应一个完整的业务。一个完整的业务需要批量的DML语句(INSERT、UPDATE、DELETE)共同联合完成,因此事务只和DML语句有关或者说DML语句才有事务。简单来说,事务是应用程序中一系列存在逻辑顺序的操作,所有操作必须全部成功,否则在每个操作中所作的更改都会被册小。

一个事务会涉及到大量的CPU计算和I/O操作,这些操作被打包成一个执行单元。所以说:事务是一组原子性的SQL命令或者说是一个独立的工作单元。这个工作单元要么同时都完成,要么同时都不完成。如果其中有任何一条语句因为崩溃或其它原因而无法执行,那么工作单元中的所有SQL语句都不会执行。

事务(Transaction)由单独单元的一个或多个SQL语句组成,在这个单元中每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚(Rollback),所有受到影响的数据将返回到事务开始之前的状态。如果单元中的所有SQL语句全部执行成功则事务被顺序执行。

在事务执行的过程中,未结束之前,DML语句是不会更改底层数据的,只会将历史操作记录一下,并在内存中完成记录。只有当事务执行结束的时候,而且是成功的结束的时候,才会修改底层磁盘文件中的数据。

为什么会出现事务呢?

现代应用程序大多都是多用户(多进程、多线程)的,对于同一张表可能会同时有多个用户同时在操作,为了保持数据的一致性,所以提出了事务的概念。

MySQL 事务
事务场景

例如:转账业务中两个账户需要同时进行加减对应的金额

MySQL 事务
转账业务
UPDATE user SET balance=100 WHERE uid=1;
UPDATE user SET balance=200 WHERE uid=2;

这两个DML语句必须同时成功或者同时失败,所以最小单元是不可再分的。

  • 当第一条DML语句执行成功,并不能将底层数据库中的第一个账户的数据修改,只是将操作记录一下,这个记录是在内存中完成的。
  • 当第二条DML语句执行成功后,和底层数据库文件中的数据完成同步。若第二条DML语句执行失败,则清空所有的历史操作记录。

未完待续...