参考链接: 事务ACID理解
一、事务(transaction)
最直观的概念:要么都成功,要么都失败(其实这只是事务的原子性特征)
以转账来说明:
下面就是一个事务:
A给B转账:A -200
B收到钱: B +200
1.1 事务的四个特性:
ACID:原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability)
几个概念:脏读,幻读,不可重复读 …
-
原子性 (Atomicity)
要么都成功,要么都失败 -
一致性 (Consistency)
事务前后的数据完整性保持一致,1000 -
持久性 (Durability)
事务一旦提交则不可逆,被持久化到数据库中 -
隔离性 (Isolation)
当多个用户并发访问数据库时,数据库为每个用户开启一个事务,各个事务之间互不干扰
1.2 事务隔离导致的一些问题
-
脏读:
一个事务读取了另一个未提交事务的数据 -
不可重复读:
一个事务读取表中某一行数据,多次读取结果不同 -
幻读:
一个事务读取到了其他事务插入到数据
二、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;