事务基础
- 什么是事务
- MySQL 中的事务主要用于处理操作量大,复杂度高的数据。
- MySQL 中只有使用了 Innodb 数据引擎的数据库或表才支持事务。
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
- 事务用来管理 insert,update,delete 语句
- 事务基本使用
开启事务: start transaction; / begin;
需要保证要么一起成功要么一起失败的语句
提交事务: commit; 如果执行的过程中没有发生意外, 那么就可以commit,代表都成功了
回滚事务: rollback; 如果执行的过程中发生意外, 那么就可以rollback回到修改前的状态
实例:
create table bank(
id int auto_increment primary key,
card char(4),
money int
);
insert into bank values(null, '1001', 1000);
insert into bank values(null, '1002', 500);
begin;
update bank set money=money-500 where card='1002';
rollback;
update bank set money=money+500 where card='1001';
commit;
注意点: 事务其实就是将原有的数据拷贝了一份, 在拷贝的基础上进行修改
如果发生了意外, 回滚的时候直接删掉拷贝的数据即可
如果没有发生意外, 那么需要通过commit将拷贝的数据应用到原始表中
在MySQL中可以通过 delimiter 修改界定符号
事务的回滚点
- savepoint 回滚点的名称
- rollback to 回滚点的名称
begin;
insert into bank values(null, '1003', 3333);
savepoint aa;
insert into bank values(null, '1004', 4444);
savepoint bb;
insert into bank values(null, '1005', 5555);
rollback to aa;
注意点: 回滚到指定的点之后也不会自动提交, 如果想提交还是必须手动调用commit;
事务特点
- 原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read多个并发事务会按照单线程来执行, 前面的没有执行完毕, 后面的不能执行
- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。