《MySQL 性能优化》之数据库事务与隔离级别

文章目录

            数据库事务
            事务控制
            隔离级别
                可重复读
                读已提交
                更新丢失

上一篇我们介绍了 InnoDB 存储引擎的内存和磁盘体系结构。

MySQL 中的 InnoDB 存储引擎具有事务安全性,能够保证多个用户并发访问相同数据时的数据一致性和完整性;同时也不会由于系统崩溃或硬件故障导致数据的破坏。
数据库事务

在数据库中,事务(Transaction)是指一组相关的 SQL 语句操作,它们在业务逻辑上是一个原子单元。

    📝原子在化学反应中不可分割,但是在物理状态中,原子由原子核和绕核运动的电子组成。不过在数据库领域中,我们仍然借助原子表示一个不可分割的整体操作。

最常见的数据库事务就是银行账户之间的转账操作。比如从 A 账户转出 200 元到 B 账户,其中就包含了多个操作:

    查询 A 账户的余额是否足够;
    从 A 账户减去 200 元;
    往 B 账户增加 200 元;
    记录本次转账流水。

显然,数据库必须保证所有的操作要么全部成功,要么全部失败。如果从 A 账户减去 1000 元成功执行,但是没有往 B 账户增加 1000 元,意味着客户将会损失 1000 元。用数据库中的术语来说,这种情况导致了数据库的不一致性。

通过以上案例,我们知道数据库事务需要满足一些特性。SQL 标准定义了事务的四种属性:ACID。

    Atomic,原子性。一个事务包含的所有 SQL 语句要么全部成功,要么全部失败。例如,某个事务需要更新 100 条记录,但是在更新到一半时系统出现故障;数据库必须保证能够回滚已经修改过的数据,就像没有执行过该事务一样。
    Consistency,一致性。事务开始之前,数据库位于一致性的状态;事务完成之后,数据库仍然位于一致性的状态。例如,银行转账事务中,如果一个账户扣款成功但另一个账户加钱失败,那么就会出现数据不一致(此时需要回滚已经执行的扣款操作)。另外,数据库还必须保证满足完整性约束,比如账户扣款之后不能出现余额为负数(可以在余额字段上添加检查约束)。
    Isolation,隔离性。隔离性与并发事务有关,隔离意味着一个事务对数据的修改在其完成之前对其他事务是不可见。例如,账户 A 向账户 B 转账的过程中,账户 B 查询的余额应该是转账之前的数目;如果多人同时向账户 B 转账,结果也应该保持一致性,就像依次转账的结果一样。MySQL 支持 SQL 标准中的 4 种事务隔离级别。
    Durability,持久性。已经提交的事务必须永久生效,即使发生断电、系统崩溃等故障,数据库都不会丢失数据。对于 InnoDB 而言,使用的是重做日志(REDO)实现事务的持久性。

事务控制

我们先来了解一下 InnoDB 中的事务控制。使用以下语句创建一个简单的示例表:

mysql> CREATE TABLE accounts(id INT AUTO_INCREMENT PRIMARY KEY, user_name varchar(50), balance numeric(10,4));
Query OK, 0 rows affected (0.75 sec)

mysql> ALTER TABLE accounts ADD CONSTRAINT bal_check CHECK(balance >= 0);
Query OK, 0 rows affected (2.95 sec)
Records: 0  Duplicates: 0  Warnings: 0
 

更多请见:http://www.mark-to-win.com/tutorial/51575.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值