关于MySQL数据库事务知识
这篇文章是我学习数据库事务的笔记,这些基础知识学了很久了,但是总是有些模糊,借此学习笔记,来简单梳理一下数据库事务的一些基本常识。 <br> 关键词:ACID; TRANSACTION ISOLATION LEVEL;
什么是事务
事务(transaction)是数据库管理系统中一个重要的机制,如何理解事务的功能,就得通过事务的4大特性(ACID)理解:
-
Atomicity原子性 <br> 事务成功即有,失败回滚则无,在事务执行过程中所有语句要么全部执行,要么全部没有执行。不存在事务中的代码执行一半的情况。
-
Consistency一致性<br> 事务执行完成后,不会改变数据库原有规则。
-
Isolation隔离性<br> 事务彼此具有不同程度的隔离级别,隔离级别从低到高分别是Read Uncommitted;Read Committed; Repeatable Read; Serializable;
-
Durabilty持久性<br> 事务执行成功后,修改的数据是持久的,不会因为关闭数据库管理系统后就消失。
如何在MySQL中使用事务
首先,MySQL数据库引擎中,InnoDB支持事务(也支持行锁),所以需要将table中的数据库引擎设置为InnoDB;
// 修改引擎为InnoDB
alter table tableName type=InnoDB
// 查看表使用的数据库引擎
show create table tableName
之后,就可以使用
begin;
或者
start transaction;
来启动事务。
事务执行完成后,有两种选择,一是提交,二是回滚:
// 提交
submit;
// 回滚
rollback;
提交就是将事务中执行的所有代码都执行完成,回滚代表着这个事务不曾执行过。
脏读、不可重复读、幻读
事务的执行过程中会出现脏读、不可重复读和幻读。
-
Drity Read 脏读<br> 事务执行过程中读取另一个事务正在操作的字段,导致的可能结果就是第一个事务读取到第二个事务未提交的字段,而第二个事务RollBack后,第一个事务相当于读到一个假数据,这就是脏读。
-
Non-repeatable read 不可重复读<br> 第一个事务第一次读取某字段时,第二个事务提交了更新该字段的代码,导致第一个事务第二次读取某字段与第一次读取的数据不同,即不可重复读。
-
Phantom Read 幻读 第一个事务第一次读取了n行字段,第二个事务提交了insert语句,导致第一个事务第二次读取了n+1行字段,即幻读。
事务隔离级别
上文说到,事务隔离级别从低到高分别是Read Uncommitted;Read Committed; Repeatable Read; Serializable;
网上一篇关于事务隔离级别的文章中有以下这张图,很好诠释了不同事务隔离级别的功能。
值得注意的是可串行化会锁住执行的字段,所以千万记得加where条件语句。
关于锁的小知识
- 对于update,insert,delete语句会自动加排它锁(相当于在执行语句后面加FOR UPDATE)