1.事务介绍
事务(transaction),需要在同一个处理单元中执行的一系列更新处理的集合,也就是说事务是多个DML语句的集合体,语法如下
BEGIN TRANSACTION/START TRANSACTION; #事务开始,不同DBMS不一样,SQL Server和PostgreSQL是BEGIN,MySQL是START,Oracle和DB2没有 UPDATE sale SET sale_price=sale_price*0.9; #DML语句1 INSERT INTO sale ( product_name, product_type, sale_price, purchase_price, regist_date) values ( '雪碧', '酒水', '10', '3', '2021-03-01'); #DML语句2 DELETE FROM sale where product_type='酒水'; #DML语句3 COMMIT/ROLLBACK; #COMMIT提交处理,ROLLBACK回滚,取消DML语句的操作
ROLLBACK操作一定要在没有执行COMMIT的基础上实现,一旦COMMIT之后就不能再ROLLBACK了。在实际应用场景中我们并看不到COMMIT和ROLLBACK,连接上MySQL之后就可以直接进行操作,对数据库进行修改了,这是因为输入的DML语句在执行的时候被放在了BEGIN和COMMIT之间了,这种模式称为自动提交模式,每个SQL命令就是一个事物。
在执行DML的时候,并不会修改数据库数据,直到用户COMMIT或者ROLLBACK的时候才会产生数据变化的模式成为手动提交模式。
2.事务的特性
事物的特性有四点,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称ACID。
2.1 Atomicity
事务中的多个DML语句必须全部执行正确,某个语句出错,整个事务都不会COMMIT,全部ROLLBACK,这样能够确保事务的完整性,在出现部分错误的时候能及时被用户获取到信息,不会出现用户以为全部执行了,其实只有部分执行的现象。
2.2 Consistency
指的是事务中的处理要满足数据库的约束限制,比如主键约束和NOT NULL等,如果插入违反约束规则的数据的时候会ROLLBAKC并不会COMMIT。
2.3 Isolation
指的是事务之间不会互相干扰,在事务中任何操作没有COMMIT之前,其他事务对该事务不可知。
2.4 Durability
在事务(包含COMMIT和ROLLBACK)结束后,DBMS能够保证该时间点的数据状态会被保存,即使由于系统故障导致数据丢失,数据库也能通过一定的手段进行恢复。最为常见的恢复手段就是将事务的执行记录保存到日志中,当发生故障时,可以从日志恢复到故障前状态。
3.事务实操
START TRANSACTION; insert into sale ( product_name, product_type, sale_price, purchase_price, regist_date) values ( '雪碧', '酒水', '10', '3', '2021-03-01'); COMMIT;
执行START TRANSACTION和INSERT INTO语句,不执行COMMIT,可以发现在当前的MySQL的连接下查询的结果已经有新的数据行记录了,但是换一个连接就没有这个数据行记录。
下面执行COMMIT再在新的连接中查看,已经有酒水记录了,这样COMMIT是不是就很好理解了。