高性能MySQL学习笔记(3) —— 数据库事务
来源:互联网 发布:苹果售后预约软件 编辑:程序博客网 时间:2024/06/06 03:04
数据库事务
概述
数据库事务,简称事务,指的是访问并可能更新数据库中各种数据项的一个程序执行单元。事务通常由高级数据库操纵语言(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结束事务。
- 高性能MySQL学习笔记(3) —— 数据库事务
- 高性能MySql学习笔记——锁、事务、隔离级别
- 高性能MySql学习笔记——锁、事务、隔离级别
- 高性能MySql学习笔记1——锁、事务、隔离级别
- 高性能MySQL学习笔记(4) —— 事务隔离级别
- 高性能MySql学习笔记——锁、事务、隔离级别
- 高性能MySQL学习笔记(1) —— MySQL架构
- 高性能MySQL学习笔记(2) —— 并发控制
- 高性能MySQL学习笔记(5) —— MVCC
- MySQL高性能学习笔记
- Mysql学习笔记-数据库事务
- 高性能mysql笔记(一)并发 事务 引擎
- 高性能MySQL之事务
- 【学习笔记】高性能MySQL(第三版)——第2章:MySQL基准测试
- 高性能MySql学习笔记(一)
- 高性能MySQL学习笔记(二)
- mysql高性能学习笔记整理
- 高性能MySQL学习笔记(2)
- 如何编写API文档?高校开发
- Azure Redis Cache 简介
- oc语言的时间输出格式
- Qt中打开二维、三维的工程图
- Android安全开发之Provider组件安全
- 高性能MySQL学习笔记(3) —— 数据库事务
- 133. array_map()
- JConsole监控本地windows Tomcat服务
- 剑指offer:打印1到最大的n位数
- 热备份和冷备份
- Centos6.5使用yum安装mysql——快速上手必备
- Android 设计模式之单例模式
- Oracle VM VirtualBox下ubuntu虚拟机存储空间不够解决方案
- 打包上传时可能遇到错误