欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

高性能MySQL-详解事务与隔离级别

程序员文章站 2022-04-21 21:46:50
...


本文主要包括一下内容:
(1) 事务的概念与ACID
(2)事务的隔离级别
(3)MySQL中的事务

1. 事务与ACID

理解事务是其它高级概念的基础。

事务:事务就是一组原子性的SQL查询,或则说是一个独立的执行单元,要么全部成功,要么全部失败,如果失败了就回滚到事务之前的状态

下面来理解一下数据库中关于ACID的概念:原子性、一致性、隔离性、持久性。
(1)原子性:事务中的操作是一个不可分割的整体单元,要么全部都做,要么全部不做。

(2)一致性:事务执行前后数据库都必须处于一致性状态。

(3)隔离性:通常来说,一个事物所做的修改在最终提交之前对其余事务是不可见的。这里就涉及到事务的隔离级别的问题了。

(4)持久性:一旦事务提交完成,修改就是永久的,即使服务器宕机也不会影响到。

为了更好地理解ACID,下面以银行账户转账为例进行说明:

-- 开始事务START TRANSACTION;
-- 查询支票账户余额+
SELECT balance FROM checking WHERE customer_id = 10233276;+
-- 将支票账户减去200UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
-- 将余额账户增加200UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
-- 提交事务更新COMMIT;

原子性:要么完全提交(10233276的checking余额减少200,savings 的余额增加200),要么完全回滚(两个表的余额都不发生变化)

一致性:这个例子的一致性体现在 200元不会因为数据库系统运行到第3行之后,第4行之前时崩溃而不翼而飞,因为事物还没有提交。

隔离性:允许在一个事务中的操作语句会与其他事务的语句隔离开,比如事务A运行到第3行之后,第4行之前,此时事务B去查询checking余额时,它仍然能够看到在事务A中被减去的200元(账户钱不变),因为事务A和B是彼此隔离的。在事务A提交之前,事务B观察不到数据的改变。

持久性:这个很好理解,就是事务提交之后修改就是永久的。

事务跟锁一样都会需要大量工作,因此你可以根据你自己的需要来决定是否需要事务支持,从而选择不同的存储引擎。

2. 事务的隔离级别

SQL定义了四种隔离级别,用来限定事务内哪些数据是可见的。很明显低级别的隔离级别拥有更高的并发性,系统开销也更加小,但是随之而来的就是带来的数据安全性问题。

Read Uncommitted(未提交读)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,也被称之为脏读(Dirty Read)。该级别用的很少。

Read Committed(提交读)

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变,换句话说就是事务提交之前对其余事务不可见。这种隔离级别也支持不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select查询可能返回不同结果。

Repeatable Read(可重复读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

Serializable(可串行化)

这是最高的隔离级别,它强制事务都是串行执行的,使之不可能相互冲突,从而解决幻读问题。换言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

MySQL中实现这四种隔离界别可能产生的问题如下:
高性能MySQL-详解事务与隔离级别

3. MySQL中的事务

MySQL中默认的是采取自动提交模式(AutoCommit),也就是说只要不是显示的开启一个事务,每个查询操作都被当做一个事务执行提交的操作。

我们可以通过设置 AUTOCOMMIT 变量来启动或则禁用自动提交模式。
设置1表示启用AUTOCOMMIT,0表示禁用AUTOCOMMIT。


本文主要包括一下内容:
(1) 事务的概念与ACID
(2)事务的隔离级别
(3)MySQL中的事务

以上就是高性能MySQL-详解事务与隔离级别的详细内容,更多请关注其它相关文章!