事务

什么是事务

要么都成功,要么都失败

  1. SQL 执行,A给B转账 A 800 —->200 B 200
  2. SQL执行,B收到A的钱,A600 B400

将一组SQL放在一个批次中去执行

事务原则:ACID原则:原子性,一致性,隔离性,持久性

以上面的例子 A 给 B 转账200
A少了200,B多了200
原子性(Atomicity ):这两个步骤一起成功或者一起失败。


无论两人互相之间如何转,两个人最终的和是1000,不会变。

一致性(Consistency):最终一致性,事务前后的数据完整性要保持一致。


操作前 A:800,B:200 操作后 A:600,B:400 如果在操作前(事务还没提交)服务器宕机或者断电,那么重启数据库之后,数据状态为 A:800,B:200 如果在操作之后(事务已经提交)服务器宕机或者断电,那么重启数据库之后,数据状态为 A:600,B:400

持久性(Durability):事务没有提交,恢复到原状,事务已经提交,持久化到数据库。事务一旦提交就不可逆,持久化到数据库中。


A给B赚钱,B给C转钱,互相之间不会影响。 针对多个用户同时操作,主要是排除其它事务对本次事务的影响

隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每个用户开启的事务,不能被其它事务的操作数据所干扰,事务之间要相互隔离。

事务的隔离导致的问题

脏读

指一个事务读取到了另一个事务未提交的数据。

不可重复读

在一个事务内读取表中的某一行数据,多次读取结果不同。(不一定是错误,只是某些场合不对)

虚读(幻读)

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

执行事务

mysql是默认开启事务自动提交的

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

-- 手动处理事务
SET autocommit = 0 -- 关闭自动提交
-- 事务开启
START TRANSACTION    -- 标记一个事务的开始,从这个之后的sql都在一个事务内

-- 提交:持久化(成功)
COMMIT
-- 回滚:回到原来的样子(失败)
ROLLBACK
-- 事务结束
SET autocommit = 1 -- 开启自动提交

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

模拟场景

-- 转账

CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci;

USE shop;

SHOW TABLES;

-- DECIMAL(P,D);
-- P是表示有效数字数的精度。 P范围为1〜65。
-- D是表示小数点后的位数。 D的范围是0~30。MySQL要求D小于或等于(<=)P。

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',10000.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;    -- 恢复默认值
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
247
粉丝
18
喜欢
217
收藏
62
排名:731
访问:9753
私信
所有博文
社区赞助商