mysql事务

2021-12-14  本文已影响0人  梁帆

mysql的InnoDB引擎支持事务,它用COMMIT、SAVEPOINT及ROLLBACK支持事务处理。
事务就是一个原子性操作,一个完整的业务逻辑。
事务的特点是四点,简称ACID。原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

一、事务的情景举例

试想一下下面的情景:
A向B转了100元,那么

A的账户-100
B的账户+100

这就是一个完整的业务逻辑。对于在mysql中就是两个update语句,它们要么同时成功,要么同时失败,是不可再分的。

二、事务是DML语句专有的

只有DML语句才有事务这么一说,其它语句与事务无关。
DML语句指的是数据操纵语句,包括update、insert、delete;而DDL语句指的是数据定义语句,包括创建数据库中的各种对象——表、视图、索引、同义词、聚簇等。
只要你的操作涉及到数据的增删改,那就意味着一定要考虑安全问题。

三、事务的开始和结束

InnoDB存储引擎中,提供了一组用于记录事务性活动的日志文件。当事务的执行过程中,每一条DML语句都会记录到这个日志文件里。如果COMMIT提交的话,日志文件就会被清空。

有案例如下:
在初始状态下,某张表中没有任何rows的。

// 1.开始事务
start transaction;
// 2.写DML语句
insert ...
insert ...

这里我们如果进行select语句查看表中数据时,会发现表中已经存有了数据;此时如果选择执行

// 3.回滚事务
rollback;

再次查询表中数据,会发现数据已经没了。
如果你执行

// 3.提交事务
commit;

在已经提交了的情况下,你再使用rollback,也无法使得数据还原到事务前的状态。

注意,在没有start transaction的情况下,你直接输入DML语句,就相当于是被commit了的事务,只不过它是被默认执行的;此时你执行rollback不会有任何用。

这种自动提交实际上是不符合我们的开发习惯的,因为一个业务通常是需要多条DML语句执行才能完成的,为了保证数据的安全,必须要求同时成功之后再提交,所以不能执行一条就提交一条。

四、事务的隔离级别

重点说下事务的隔离性(isolation)
事务和事务之间的隔离级别主要有4个级别。

隔离级别以此从低到高。

上一篇下一篇

猜你喜欢

热点阅读