Qingquan-Li / blog

My Blog
https://Qingquan-Li.github.io/blog/
132 stars 16 forks source link

MySQL_4 使用事务保证数据完整性_TCL(SET AUTOCOMMIT、START TRANSACTION、COMMIT、ROLLBACK) #23

Open Qingquan-Li opened 7 years ago

Qingquan-Li commented 7 years ago

本篇博客(第四篇)重点:

掌握 MySQL 的事务处理方法(事务控制语言(TCL)) 了解 MySQL 事务处理的应用场景 理解 MySQL 的 ACID 原则

MySQL 的事务处理

注意 MySQL事务处理只支持 InnoDB 和 BDB 数据表类型

MySQL的事务实现方法

SET AUTOCOMMIT

注意:MySQL 中默认是自动提交,使用事务时应先关闭自动提交

START TRANSACTION

COMMIT

ROLLBACK


MySQL事务处理步骤

mysql



MySQL 事务处理的应用场景

场景: 顾客A在线购买一款商品,价格为500.00元,采用网上银行转账的方式支付 假如顾客A银行卡的余额为2000.00元,且向卖家B支付购买商品费用500.00元,起始卖家B的账号金额10000.00元

创建数据库 shop 和创建表 account 并插入2条数据:

/*创建 shop  数据库*/
CREATE DATABASE IF NOT EXISTS `shop`;

/* 创建 账户表 */
CREATE TABLE IF NOT EXISTS  `account` (
    `id` int(11) not null auto_increment,
    `name` varchar(32) not null,
    `cash` decimal(9,2) not null,
     PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO `account` (`name`,`cash`) VALUES ('A',2000.00);
INSERT INTO `account` (`name`,`cash`) VALUES ('B',10000.00);
+-------+--------------+------+-----+---------+----------------+ 
| Field | Type         | Null | Key | Default | Extra          | 
+-------+--------------+------+-----+---------+----------------+ 
| id    | int(11)      | NO   | PRI | NULL    | auto_increment | 
| name  | varchar(32)  | NO   |     | NULL    |                | 
| cash  | decimal(9,2) | NO   |     | NULL    |                | 
+-------+--------------+------+-----+---------+----------------+ 

INSERT INTO `account` (`name`,`cash`) VALUES ('A',2000.00); 
INSERT INTO `account` (`name`,`cash`) VALUES ('B',10000.00); 

网上支付

设置场景: A账户成功减少500元,B账户应该增加500元,但一些错误导致未增加成功,这时则需返回A账户的500元,达到账户总额的平衡

需求说明:

/* 事务处理*/
select * from account;
set autocommit= 0; 
START TRANSACTION; 
update account set cash = cash - 500  where name = 'A';
select * from account; 
ROLLBACK;  
set autocommit = 1; 
select * from account;



事务的 ACID 原则