面试问题我爱编程

MYSQL事务-隔离级别

2016-11-30  本文已影响118人  波罗学的草稿

GIT还没有更新完成,最近因为工作原因要解决MYSQL的一些问题,转而开始重新学习MYSQL。本想把多版本并发控制MVCC也一并说明,但理解不够透彻,待总结再续。

本篇文章的重点在于总结MYSQL事务。

事务是什么?

事务简言之就是一组SQL执行要么全部成功,要么全部失败。MYSQL的事务在存储引擎层实现。

事务都有ACID特性:

事务最常用的例子就是银行转账。假设polo需给lynn转账1000元,如下步骤:

SQL语句如下:

mysql> BEGIN;
mysql> SELECT balance FROM bank_account WHERE uid=10001;
mysql> UPDATE bank_account SET balance=balance-1000 WHERE uid=10001;
mysql> UPDATE bank_account SET balance=balance+1000 WHERE uid=10002;
mysql> COMMIT;

注:mysql启动事务可使用BEGIN或者START TRANSACTION;

上述三个步骤执行在一个事务中就能够保证数据的完整性,要么全部成功,要么全部失败。

MYSQL提供两种事务型引擎:Innodb和NDBCluster。默认采用自动提交模式,执行一条语句自动COMMIT。通过AUTOCOMMIT变量可启用或者禁用自动提交模式:

mysql> SHOW VARIABLES LIKE "AUTOCOMMIT";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql> SET AUTOCOMMIT=1

AUTOCOMMIT=1表示开启默认提交,0表示关闭默认提交需要手动提交。

事务隔离级别

事务隔离性的解释:通常情况下,事务在提交之前对于其他事务不可见。

数据库有四种隔离级别,当然MYSQL也是如此。

本人理解,隔离级别就是决定一个事务的修改另一个事务什么情况下能看到。
书本解释,每种级别都规定了一个事务中所做修改,哪些在事务内和事务间是可见的。

区别在于是否存在事务内可见性的规定。我在四个级别似乎没有看到

下面开始说明MYSQL的四种隔离级别,先准备一张学生表:

mysql> CREATE TABLE `student` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(32) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |

只有id(主键自增)与name字段

隔离级别对照图

隔离级别 脏读 不可重复读 幻读 加锁读
未提交读
提交读
可重复读
未提交读

好了,关于事务的隔离级别就说这么多,希望自己的理解没有错误。

本人资历尚浅,如有错误请指正。谢谢!

Paste_Image.png
上一篇 下一篇

猜你喜欢

热点阅读