事物(Transaction)是指作为一个逻辑工作单位执行的一系列操作,这些操作要么全部成功,要么全部失败。事物确保对多个数据的修改作为一个单元来处理。
- 在Mysql中,只有使用了Innodb存储引擎的数据库或表才支持事物。
- 事物用于维护数据库的完整性,保证成批的sql语句要么都执行,要么都不执行。
- 事物用于管理insert、update和delete语句。
例如,张三在ATM机上给李四转账100元,在银行的业务系统中,主要会执行两步数据变更操作:
- 从张三的账号减去100元;
- 给李四的账户增加100元。
试问,如果操作1执行成功,操作2执行失败会发生什么情况?
事物的四个特性
如果某个数据库声称支持事物,那么该数据库必须具备ACID四个特性,即Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)。
特性 | 描述 |
---|---|
原子性 | 事物必须是原子工作单元,事物中包含的各操作要么都做,要么都不做。 |
一致性 | 事物在执行完成时,必须使所有的数据都保持一致状态。 |
持续性 | 事物执行完成之后,它对系统的影响是永久性的 |
隔离性 | 事物独立运行。多个事物之间相互隔离,互不干扰。事物的100%隔离,会牺牲速度。 |
Mysql的事物控制
在默认情况下,Mysql是自动提交事物的,即每一条insert、update、delete的SQL语句提交后会立即执行commit操作。因此,要开启一个事物,可以使用start transaction或begin,或者将autocommit的值设置为0.
#autocommit的值默认为1
select @@autocommit;
#将autocommit的值设为0
set autocommit=0;
#再次查看autocommit的值
select @@autocommit;
#开启事物
start transaction;
begin;
#事物回滚、提交
rollback;
commit;
select @@autocommit;
创建表、插入数据
create table bank_account(
id int not null auto_increment primary key,
name varchar(30) comment '姓名',
balance decimal(18,2) comment '账户余额'
)default charset=utf8;
insert into bank_account(id,name,balance) values(1,'张三',0);
insert into bank_account(id,name,balance) values(2,'李四',0);
update bank_account set balance=balance+1000 where id=1;
示例
#开启一个事物
start transaction;
#修改操作
update bank_account set balance=balance-100 where id=1;
#修改操作
update bank_account set balance=balance+100 where id=2;
#事物提交
commit;
#查看数据变化
select * from bank_account
#开启一个事物
start transaction;
#修改操作
update bank_account set balance=balance-100 where id=1;
#修改操作
update bank_account set balance=balance+100 where id=2;
#事物回滚
rollback;
#查看数据变化
select * from bank_account