数据库事务

事务概述

现实生活中我们经常会进行银行转账操作,该操作可分为两部分来完成:账户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%的持久,只能从事务本身的角度来保证永久性,而一些外部原因导致数据库发生故障,如硬盘损坏,那么所提交的数据可能都会丢失。

posted @ 2023-09-30 18:15  小崽子&  阅读(46)  评论(0)    收藏  举报