一:概述
在MySQL中的事务(transaction)是由存储引擎实现的,在MySQL中,只有lnnoDB存储引擎才支持事务;
事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行;
事务用来管理DDL,DML,DCL操作,比如insert,update,delete语句,默认是自动提交的;
二:基本操作
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; -- 撤销之前的操作(还未提交)
三:特性
四:隔离级别
(1)概述
lsolate,顾名思义就是将事务与另一个事务隔离开,为什么要隔离呢?如果一个事务正在操作的数据被另一个事务修改或删除了,最后的执行结果可能无法达到预期。如果没有隔离性还会导致其他问题。
(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事务不能操作