高性能MySQL学习笔记(3) —— 数据库事务

数据库事务

概述

  数据库事务,简称事务,指的是访问并可能更新数据库中各种数据项的一个程序执行单元。事务通常由高级数据库操纵语言(DML)或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。
  事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成(说白了就是一系列操作的集合)。这之间的操作数并没有规定,全有开发者自己定义,可以认为一条SQL语句就是一个事务,或者一组SQL语句,甚至整个程序都可以认为是一个事务。
  事务是一个逻辑工作单元,是一种技术,一种机制,其有四个重要的特性,也就是常说的ACID。一个运行良好的事务处理系统必须具备这些特征保证。

事务特性

1. 原子性:Atomicity

  事务里的操作,要么都完成,要么一步也不做,不可能只执行一部分;如果操作执行到一半失败,则回滚之前的操作,使之状态成为未执行事务前。原子性的作用用一个烂大街的例子很能说明问题:
银行卡转账:账号A转款到账号B,操作步骤:
1.账号A余额 -m 元;
2.账号B余额 +m 元。
很显然,这两操作肯定要么同时操作成功,要么都失败。
用代码可以描述如下:

boolean result01 = A.delete(m);
if(result01){
    boolean result02 = B.add(m);
    if(result02){ return success;}
    else{
        A.add(m);
        return fail;
    }
}
return fail;
//原子性是下面一致性的前提
//原子性不止需要程序保证,还需要数据库保证,因为你不知道什么时候程序就奔溃了

2. 一致性:Consistency

  事务前后要保持数据库的一致性,所谓的一致性就是:事务中的写操作更改了这里,与之相关联的所有地方应该也要相应的更改。一致性与原子性紧密相连,因为若无法保证事务的原子性,就不要说保证事务的一致性了。
还是以上面银行转账为例:
  账号A减了m元,账号B就要增加m元,不是m-1元,也不是m+1元。
再举一个更容易理解的例子:
  产品表与产品明细表,这两个表是关联的:产品明细表有产品表中产品id作为外键。
向产品表增加了一个产品,则必须在产品明细表中增加相应的产品明细记录。
  所谓的数据一致性,是一种规则的体现,这些规则设定好,可由程序或数据库实现保证。

3. 隔离性:Isolation

  事务未完成之前,外面看到的数据是之前的状态,即事务中间的数据状态是不会让其他事务查看的。从另一面来说:两个事物互不影响,这即事务的隔离性。
  当然,这其中其实不是绝对的,隔离性这边数据库提供了很多级别,比如:序列化级别,该事务一旦进行,其他与之相关联的事务(会操作同一个数据记录的)就只能等这个事务完成后才能进行,所以更不用说其他事务能看到这个事务的中间数据了。
  关于事务的隔离级别可参考:事务隔离级别
依然以银行转账说明:
  在A减去m元后,B未加m元时,即事务没完成,这个时候有其他程序(事务)想要查看A的余额(仅仅是查看的话,即读操作,一般是可以查看的),其查看到的数据是未减去之前的数值,而不是减去m元的数值。
  数据库系统会根据隔离级别自动加锁。

4. 持久性:Durability

  事务一旦完成,就将永久保存修改,哪怕发生系统故障也将不变。这一点一般由数据库通过数据库备份和恢复来保证,持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即对已提交事务的更新恢复。

事务的实现保证

  事务具有以上四点特性,有的是程序可以完成的,有的则是不能的,但正如之前所说,程序是不可靠的(对于数据库来说),所以,一般数据库都提供了一种保证事务的物理完整性的机制,比如锁定设备隔离事务、记录设备保证事务持久性等机制。因此,我们不必关心数据库事务的物理完整性,而应该关注在什么情况下使用数据库事务、事务对性能的影响,如何使用事务等等。

事务何处用

  事务用于场景:对数据经常进行写操作的场景,因为读操作不会改变数据,也就不会引起数据各种错误,也就不需要保证操作的ACID特性。

MySQL 事务

  一个实现了事务处理系统(保证事务的ACID)的数据库,相比没有实现的,需要更强的CPU处理能力、更大的内存和更多的存储空间,但是有些场景是不太需要事务处理能力的,也就不需要具有事务处理能力的数据库(因为他们需要更大的资源),这也就是MySQL优势的地方:根据需要选择相应存储引擎。
  MySQL中InnoDB、NDB cluster存储引擎实现了事务功能,当然还有其他第三方存储引擎也实现了,默认下采用自动提交模式,即若不显式开始一个事务,每一个操作当做一个事务进行操作,可以通过设置AUTOCOMMIT变量来启用或禁用自动提交模式,如果禁用了则需显式执行COMMIT或ROLLBACK结束事务。

猜你喜欢

转载自blog.csdn.net/a327369238/article/details/52701339