事务的功能
- 数据库表中数据进行的添加、删除和修改操作均属于数据库操纵语言(DML),这类类型的SQL语句需要执行commit数据控制语言(DCL)才能执行成功;执行rollback数据控制语言(DCL)可以撤销尚未执行commit语句的DML操作
- 如果没有在执行DML前先执行“set autocommit = 0; ”,则MySQL数据库执行DML后默认自动执行commit操作;MySQL数据库中执行DML前先执行“set autocommit = 0; (1是自动提交)”可撤销自动执行commit,待DML操作执行后执行“commit;”即可使DML操作起作用,执行“rollback;”可撤销DML操作并默认执行commit提交事务,例:
#创建student表
create table student(
id char(36) primary key,
name varchar(8) not null,
mobile char(11),
address varchar(150)
);
#取消自动提交事务
set autocommit = 0;
#插入一条学生信息
insert into student(id,name,mobile,address)
values ('9b4435ec-372c-456a-b287-e3c5aa23dff4','Tom','12345678901','北京海淀');
#执行到此处尚未提交事务,待执行下面的commit语句后提交事务,数据才被写入磁盘
commit;
- 当执行一组DML操作时,为了确保数据的完整性和一致性,避免数据库产生错误数据,就需要通过事务(Transaction)使该组DML操作同时成功或失败,例如:张三有两张银行卡,卡号分别是1234567890和0987654321,现从1234567890卡取出100块钱转到0987654321卡,则取出钱的卡需要减去100,转入卡需要增加100,现实生活中这两个update操作必须同时成功同时失败,如下例:
create table account(
id char(36) primary key,
card_id varchar(20) unique,
name varchar(8) not null,
money float(10,2) default 0
);
insert into account
values('6ab71673-9502-44ba-8db0-7f625f17a67d','1234567890','张三',1000);
insert into account (id,card_id,name)
values('9883a53d-9127-4a9a-bdcb-96cf87afe831','0987654321','张三');
select * from account;
- 执行结果如下图:
- 如果没有用事务的话:
update account set money=money-100 where card_id= '1234567890';
#上一条语句执行成功,而下一条语句执行失败
update account set money=money+100 whee card_id= '0987654321';
- 由于只有上一条语句执行成功了,由于不能回滚,就会出现总金额减少的情况,这个时候的查询结果如下图:
- 而如果使用了事务,则如果执行错误,可以回滚:
set autocommit = 0;
update account set money=money-100 where card_id= '1234567890';
#上一条语句执行成功,而下一条语句执行失败
update account set money=money+100 whee card_id= '0987654321';
- 由于事务没有提交,数据的改变只是在内存中,并没有真正写入磁盘,所以在当前查询中查询结果如下:
- 点开account表会发现数据没有改变:
- 这时如果在新建查询中修改该表中的数据不会成功,而会等待上一条事务提交后执行
- 这个时候显然数据并没有同步,可以执行“rollback;”撤销操作,执行“rollback;”后数据恢复原样,并且默认结束当前事务,如果新建表中有其他事务这时才能执行;如果执行结果没有错误,可以直接执行“commit;”提交事务
事务四大特性(ACID):
- 原子性(Atomicity):化学中的原子指不可再分的基本微粒,数据库中原子性强调事务是一个不可分割的整体,事务开始后所有操作要么全部成功,要么全部失败,不可能停滞在中间某个环节。如果事务执行过程中出错就会回滚到事务开始前的状态,所有的操作就像没有发生一样不会对数据库有任何影响。
- 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态,即一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还是5000,这就是事务的一致性。
- 隔离性(Isolation):当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离,比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转入钱。
- 持久性(Durability):一个事务一旦被提交,则对数据库的所有更新将被保存到数据库中,不能回滚。