Thanks to visit codestin.com
Credit goes to github.com

Skip to content

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

@qingquan-li

Description

@qingquan-li

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

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

MySQL 的事务处理

  • 事务就是将一组SQL语句放在同一批次内去执行
  • 如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行

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

MySQL的事务实现方法

SET AUTOCOMMIT

  • 使用SET语句来改变自动提交模式:
    • SET AUTOCOMMIT = 0;   关闭自动提交模式
    • SET AUTOCOMMIT = 1;   开启(还原)自动提交模式

注意: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元,达到账户总额的平衡

需求说明:

  • 案例背景:银行的转账过程中,发生意外是在所难免。为了避免意外而造成不必要的损失,使用事务处理的方式进行处理
  • A账户现有余额1000元,向B账户(账户金额为200元)进行转账500元。可能由于某原因:
    • A账户在扣除转账金额时发生错误,使用事务回滚来返回到初始状态
    • A账户成功扣除转账金额后,B账户添加转账金额发生错误,使用事务回滚到初始状态
  • 提示:先建数据表account,字段包括姓名(username)、余额(money),再分别利用事务处理以上两种情况
/* 事务处理*/
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 原则

  • 原子性(Atomic)
  • 一致性(Consist)
  • 隔离性(Isolated)
  • 持久性(Durable)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions