1.什么是事务
将一组sql放在一个批次执行,要么都成功,要么都失败
事务原则:ACID原则即原子性、一致性、隔离性和持久性(脏读,幻读)
- 原子性:要么都成功要么都失败
- 一致性:事务前后数据完整性保持一致
- 持久性:事务一旦提交则不可逆,被持久化到数据库中!
- 隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
隔离导致的问题
脏读:一个事务读取了另一个事务未提交的数据。
不可重复读:在一个事务内读取表中的一行数据,多次读取结果不同。
幻读:一个事务内读取到了别的事务插入的数据,导致前后不一致。
执行事务原理
-- ==========事务===========
-- mysql默认开启事务
SET autocommit=0/*关闭*/
SET autocommit=1/*开启*/
-- 事务开启
START TRANSACTION -- 标记一个事务的开始,从这之后的sql都在同一事务内
INSERT xx
INSERT xx
-- 提交:持久化(成功!)
COMMIT
-- 回滚:回到原来的样子(失败!)
ROLLBACK
-- 事务结束
SET autocommit=1 -- 开启自动提交
SAVEPOINT 保存点名称 -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称 -- 移除一个保存点
转账案例
-- 转账
create database shop character set utf8 collate utf8_general_ci
use shop
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`)
value ('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; -- 恢复默认值