MySql事务
要么全部执行,要么全部不执行
什么是事务
- 事务由存储引擎实现,在MySql中只有InnoDB存储引擎才支持事务。
- 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行要么全部不执行。
- 事务用来管理DDL、DML、DCL操作,比如insertm,update,delete语句,默认是自动提交的。
理解事务:
在银行转帐时,必须保证转账绝对安全,这时需要事务参与。比如张三转账给王五,张三账户扣款时,王五账户必须要入账,否则将发生以为,所以必须要么张三扣款操作和王五入账操作必须都有成功执行或者都不执行,否则将发生意外。
事务的三种操作:
1、开启事务
- 任何一条DML语句都标志着事务的开启
- 命令:begin或start transaction
2、提交事务
- 成功的结束将所有的DML语句操作历史记录和底层硬盘数据来一次同步。
- 命令:commity
3、回滚事务:Rollback Transaction
- 失败的结束,将所有的DML语句操作历史记录全部清空
- 命令:Rollback
事务操作
MySql默认自动帮我们完成事务,每执行一条SQL时,MySql就自动帮我们提交事务,如果想要手动控制事务,则必须关闭MySql的事务自动提交。
语法:
set autocommit = 0 -- 禁止自动提交
set autocommit = 1 -- 开启自动提交
实例
-- 插入数据
insert into account values
(1,'张飞',1000),
(2,'赵云',2000);
select * from account;
-- 设置MySql的事务为手动提交(关闭自动提交)
select @@autocommit;
set autocommit = 0;
-- 模拟账户转账
-- 开启事务
begin;
update account set money = money - 200 where id = 1;
update account set money = money + 200 where id = 2;
commit;
rollback;
select * from account;
事务的特性
- 原子性:事务是不可分割的整体,开启后的所有操作,要么全部执行,要么全部不执行。
- 一致性:系统从一个正确的状态迁移到另一个正确的状态。
- 隔离性:每个事务的对象对其他事务的操作对象相互分离,事务提交前对其他事务不可见。
- 持久性:事务一旦提交,则其结果是永久性的。
事务的隔离级别
isolate
如果一个事务正在操作的数据被另一个事务修改或删除,最后执行的结果可能无法达到预期。如果没有隔离性还会导致其他问题。
事务的隔离级别
级别 简介 级别 读未提交 一个事务可以读取另一个未提交事务的数据,可能造成脏读 最低 读已提交 一个事务要等待另一个事务提交后才能读取数据,可避免脏读的发生,会造成不可重复读。 低 可重复读 开始读取数据时,不再允许修改操作,可避免脏读、不可重复读的发生。但会造成幻读。 中 串行 事务串行化顺序执行,可避免脏读,不可重复读与幻读,单效率低 高
MySql的默认隔离级别是可重复读(Repeatable read)
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 是 | 是 | 是 |
不可重复读 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
串行读 | 否 | 否 | 否 |
-- 查看隔离级别
show variables like '%isolation%';
-- 设置隔离级别
set session transaction isolation level 级别字符串->[read uncommitted| read committed |repeatable read| serializable]