mysql学习笔记-事务基础知识
1、各存储引擎事务支持情况
只有InnoDB支持事务
2、事务的ACID特性
2.1原子性(atomicity)
不可分割的工作单位,要么全部提交,要么全部失败回滚。
2.2 一致性(consistency)
数据从一个语义合法性状态变换到另外一个语义合法性状态,跟具体业务有关。说你一致就一致,不一致就不一致?
举例1、A给B转账,定义了一个状态,要求A+B的总余额必须不变,变了就违反了一致性原则
举例2、在数据表中我们将 姓名 字段设置为 唯一性约束,这时当事务进行提交或者事务发生回滚的时候,如果数据表中的姓名不唯一,就破坏了事务的一致性要求。
2.3、隔离型(isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰 ,即一个事务内部的操作及使用的数据对 并发 的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。类似于java多线程,线程直接独立互不干扰。
2.4、持久性(durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是 永久性的 ,接下来的其他操作和数据库故障不应该对其有任何影响。
ACID 是事务的四大特性,在这四个特性中,原子性是基础,隔离性是手段,一致性是约束条件,而持久性是我们的目的。
3、事务的状态
3.1、活动的(active)
3.2、部分提交的(partially committed)
3.3、失败的(failed)
3.4、中止的(aborted)
3.5、提交的(committed)
3、如何使用事务
步骤1:开启事务
步骤2:一系列的DML操作
步骤3:事务结束的状态:提交的状态(COMMIT)、中止的状态(ROLLBACK)
3.1.显式事务
如何开启?使用关键字:start transaction 或begin
start transaction 后面可以跟: read only / read write(默认)/ with consistent snapshot
保存点(savepoint)
3.3、隐式事务
关键字:autocommit
set autocommit = false;
SHOW VARIABLES LIKE ‘autocommit’;#默认是ON
UPDATE account SEr balance=balance-10 WHERE id=1;#此时这条DML操作是一个独立的事务UPDATE account sET balance=balance+10 WHERE id=2;#此时这条DML操作是一个独立的事务
如果关闭自动提交?
SET autocommit= FALSE;#针对于DML操作是有效的,对DDL操作是无效的
UPDATE account sEr balance=balance-10 WHERE id = 1;
UPDATE account sEr balance=balance +10 wHRE id=2;
COMMIT;#或rollback;
#方式2:我们在autocommit为true的情况下,使用ftart transaction 或begin开启事务,那么D操作就不会自动提交数据
3.4、隐式提交数据的情况
①数据定义语言(Data definition language,缩写为:DDL)
数据库对象,指的就是 数据库 、 表、 视图、存储过程 等结构。当我们使用 CREATE、 ALTER、 DROP 等语句去修改数据库对象时,就会隐式的提交前边语句所属于的事务。即:
BEGIN;
SELECT …#事务中的一条语句
UPDATE …# 事务中的一条语句
…·# 事务中的其它语句
CREATE TABLE…#此语句会隐式的提交前边语句所属于的事务
②隐式使用或修改mysql数据库中的表
当我们使用ALTER USER、CREATE USER、 DROP USER、 GRANT、 RENAME USER、 REVOKE、 SETPASSWORD 等语句时也会隐式的提交前边语句所属于的事务。
③事务控制或关于锁定的语句
当我们在一个事务还没提交或者回滚时就又使用 START TRANSACTION 或者 BEGIN 语句开启了另一个事务时,会 隐式的提交 上一个事务。即:
BEGIN;
SELECT...#事务中的一条语句
UPDATE ...# 事务中的一条语句
#事务中的其它语句