MySQL的事务

一:概述

在MySQL中的事务(transaction)是由存储引擎实现的,在MySQL中,只有lnnoDB存储引擎才支持事务;

事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行;

事务用来管理DDL,DML,DCL操作,比如insert,update,delete语句,默认是自动提交的;

MySQL的事务_第1张图片

二:基本操作

MySQL的事务_第2张图片

 MySQL的事务_第3张图片

create table account(
     id int primary key,
		 name varchar(20),
		 money double
);

insert into account values(1,'zhangsan',1000);
insert into account values(2,'lisi',1000);

-- 设置MySQL的事务为手动提交(关闭自动提交)
select @@autocommit;
set autocommit = 0;

-- id为1的账户转账给id为2的账户
-- 开启事务
begin;
update account set money = money - 200 where id = 1;
update account set money = money + 200 where id = 2;
-- 提交事务
commit;

-- 回滚事务
rollback; -- 撤销之前的操作(还未提交)

三:特性

MySQL的事务_第4张图片

四:隔离级别

(1)概述

lsolate,顾名思义就是将事务与另一个事务隔离开,为什么要隔离呢?如果一个事务正在操作的数据被另一个事务修改或删除了,最后的执行结果可能无法达到预期。如果没有隔离性还会导致其他问题。

MySQL的事务_第5张图片

MySQL的事务_第6张图片

MySQL的事务_第7张图片 

(2)代码演示
-- 查看隔离级别
show variables like '%isolation%';


-- 设置隔离级别

-- 设置read uncommitted
set session transaction isolation level read uncommitted;
-- 这种隔离级别会引起脏读,A事务读取到B事务没有提交的数据

-- 设置read committed
set session transaction isolation level read committed;
-- 这种隔离级别会引起不可重复读,A事务在没有提交事务之前,看到数据不一致

-- 设置repeatable read
set session transaction isolation level repeatable read;
-- 这种隔离级别会引起幻读,A事务在提交事务之前和提交数据之后,看到数据不一致

-- 设置serializable
set session transaction isolation level serializable;
-- 这种隔离级别比较安全,但是效率低,A事务操作表时,表会被锁起来,B事务不能操作

你可能感兴趣的:(mysql,数据库)