事务ACID


参考链接事务ACID理解

一、事务(transaction)

最直观的概念:要么都成功,要么都失败(其实这只是事务的原子性特征)

以转账来说明:

下面就是一个事务:
A给B转账:A -200
B收到钱: B +200

1.1 事务的四个特性:

ACID:原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability)
几个概念:脏读,幻读,不可重复读 …

  1. 原子性 (Atomicity)
    要么都成功,要么都失败

  2. 一致性 (Consistency)
    事务前后的数据完整性保持一致,1000

  3. 持久性 (Durability)
    事务一旦提交则不可逆,被持久化到数据库中

  4. 隔离性 (Isolation)
    当多个用户并发访问数据库时,数据库为每个用户开启一个事务,各个事务之间互不干扰

1.2 事务隔离导致的一些问题

  1. 脏读
    一个事务读取了另一个未提交事务的数据

  2. 不可重复读:
    一个事务读取表中某一行数据,多次读取结果不同

  3. 幻读:
    一个事务读取到了其他事务插入到数据

二、mysql创建事务

mysql默认开启自动提交事务

set autocommit = 0 关闭
set autocommit = 1 开启

一般的创建事务流程如下:

set autocommit = 0
start transaction
...
事务执行语句
...
commit
set autocommit = 1

补充:savepoint

  • 还可以在事务中设置一个保存点 savepoint
  • savepoint 保存点名 – 设置一个事务保存点
  • rollback to savepoint 保存点名 – 回滚到保存点
  • release savepoint 保存点名 – 释放保存点

2.1 举例:使用事务实现一个转账操作

create database shop character set utf8 collate utf8_general_ci;
use shop

create table `account`(
  `id` int(3) not null auto_increment,
  `name` varchar(20) not null,
  `money` decimal(11,2) not null,
  primary key(`id`)
)engine=innodb default charset=utf8;

insert into account(`name`,`money`)
values('A',2000.00),('B',5000.00);

-- 模拟转账
set autocommit = 0;
start transaction;
update account set money=money - 1000 where `name`='A';
update account set money=money + 1000 where `name`='B';
commit;
-- rollback;
set autocommit = 1;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值