首页 > 技术文章 > Mysql基础:事务及测试

CL-King 2020-09-26 08:55 原文

前言

  什么是事务?  本质,将一组SQL放在一个批次中去执行的这个过程就叫事务。

  特点:要么都成功,要么都失败

 

ACID原则

  原子性:

    针对同一个事务的,这个事务中要么都完成,要么都不完成

      

  一致性

    表示事务的结束后的数据不随着外界原因导致数据丢失(事务一旦提交,就不可改变)

  隔离性

    针对多用户同时操作,主要是排除其他事务对本次事务的影响(一旦隔离失败就会产生脏读

  持久性

 

   注:1.脏读:一旦隔离失败就会产生脏读(脏读,指一个事务读取到另一个事务未提交的数据)  

     2.不可重复读:在一个事务内读取表中某一行数据,多次读取结果不同,(这个不一定是错误,只是某些场合不对)

     3.虚读(幻读):指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致(一般是行影响,多了一行)

 

===事务(语法)===

-- =======事务=========、
-- 语法
-- mysql是默认开启事务自动提交的
SET autocommit=0-- 关闭
SET autocommit=1-- 开启(默认的)

-- 手动处理事务

-- 事务开启
START TRANSACTION-- 标记一个事务的开始,从这个之后sql都在同一个事务里

INSERT xx
INSERT xx

-- 提交:持久化(成功)
COMMIT
-- 回滚:回到原来的样子(失败)
ROLLBACK

-- 事务结束
SET autocommit=1-- 开启自动提交

SAVEPOINT 保存点名-- 设置一个事务保存点
ROLLBACK TO SAVEPOINT  保存点名 --回滚到保存点

 

===模拟转账(事务)===

-- =======事务=========、


-- 模拟转账(事务),先创建一张表
CREATE TABLE `account`(
    id INT(3) not NULL auto_increment,
    `name` VARCHAR(30) NOT NULL,
    money DECIMAL(9,2) NOT NULL,
    PRIMARY KEY(id)
)ENGINE=innodb DEFAULT charset=utf8

insert into account(`name`,money)
VALUES ('A',2000.00),('B',1000.00)

-- 模拟转账:事务
set  autocommit=0;-- 关闭自动提交
START TRANSACTION -- 开启一个事务,(一组事务)
UPDATE account SET money=money-500 WHERE `name`='A' -- A减500
UPDATE account SET money=money+500 WHERE `name`='B' -- B加500

COMMIT;-- 提交事务,由次例子可得知,事务一旦被提交就被持久化
ROLLBACK;-- 回滚


SET autocommit=1;-- 恢复默认值

SELECT * FROM account

 

推荐阅读