mysql
1.事务
1)事务:事务是一个最小的不可再分的工作单元,是一组原子性的SQL操作,事务内的语句,要么全部执行成功,要么全部执行失败;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)
2)事务有四大特征(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
3)原子性:事务是一个最小的不可再分的工作单元,事务内的语句,要么全部执行成功,要么全部执行失败;事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
银行应用是解释事务的一个经典例子。假设一个银行的数据库有两张表:支票(checking)表和储蓄(savings)表。现在要从用户A的支票账户里转移200美元到她的储蓄账户,那么需要至少三个步骤:
- 检查支票账户的余额高于200美元
- 从支票账户余额中减去200美元
- 在储蓄账户余额中增加200美元
以上三个步骤的操作必须打包在一个事务中,任何一个步骤失败,则必须回滚所有的步骤。
4)一致性:一致性是指数据库总是从一个一致性的状态转换到另一个一致性的状态;在前面的例子中,一致性确保了,即使在执行第三条语句时系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中
5)隔离性:隔离性是指一个事务所做的修改在最终提交以前,对其他事务是不可见的;在前面的例子中,当还未执行完第三条语句时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元的
6)持久性:持久性是指一旦事务提交,则其所做的修改会永久保存到数据库
2.隔离级别
1)SQL标准中定义了四种隔离级别(级别递增):未提交读(Read Uncommitted)、提交读(Read Committed)、可重复读(Repeatable Read)、可串行化(Serializable)
2)未提交读:
- 未提交读是指事务中的修改即使未提交,对其他事务也都是可见的
- 事务可以读取未提交的数据,这也称为脏读:事务A正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时事务B也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么事务B读到是脏数据,假设这时候事务A回滚了
- 这个级别会导致很多问题,一般很少用
3)提交读:
- 未提交读是指一个事务从开始到提交之前,所做的任何修改对其他事务来说都是不可见的
- 未提交读避免了脏读
- 这个级别有时也叫不可重复读:事务A读取了一条数据,然后正在执行某种操作的时候,事务B将这条数据改变(update)了,然后事务A再次读取的时候,却得到的是和上一次读的时候一样的数据(但是其实这个数据已经改变了)
- 这个是大多数据库默认的隔离级别,但mysql不是
4)可重复读:
- 可重复读是指一个事务里,无论查询多少遍,都是一样的结果,即使另一个事务对数据进行了修改,查到的结果也是永远一样
- 可重复读避免了脏读,但无法解决幻读:事务A根据条件索引得到N条数据,然后事务B增添insert(或删除delete)了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就像产生了幻觉一样,平白无故的多了几条数据,成为幻读
- 不可重复读是针对update操作,而幻读针对insert/delete操作
- InnoDB存储引擎通过多版本并发控制MVCC(Multi - Version Concurrency Control)解决了幻读的问题
- 可重复读是mysql数据库的默认隔离级别
5)可串行化:
- 可串行化是指一个事务一个事务的执行,一个事务未执行完毕,另一个事务不能执行
- 可串行化避免了脏读、幻读
- 可串行化是最高的隔离级别,它会在读取的每一行数据上都加锁,可能会导致大量的超时和锁争用的问题,实际应用中很少采用
2)
3)
4)
5)
6)
1)
2)
3)
4)
5)
6)
- 2953: [Poi2002]商务旅行
- 1230: [Usaco2008 Nov]lites 开关灯
- 【推荐】C#线程篇---你所不知道的线程池(4)
- 洛谷P1333 瑞瑞的木棍(欧拉回路)
- 【推荐】C#线程篇---Task(任务)和线程池不得不说的秘密(5.1)
- 【LeetCode 20】关关的刷题日记45 – Valid Parenthese
- 1819: [JSOI]Word Query电子字典
- 【推荐】C#线程篇---Task(任务)和线程池不得不说的秘密(5.2)
- javascript 事件基础
- 算法模板——sap网络最大流 3(递归+邻接矩阵)
- 从Hash Killer I、II、III论字符串哈希
- angularjs 缓存详解
- 算法模板——线段树7(骰子翻转问题)
- 2729: [HNOI2012]排队
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 如何防止网站被扒的解决方法!
- 【python-面试题53-循环排序】寻找缺失的数
- 【python-leetcode42-区间合并】区间列表的交集
- 【python-leetcode202-快慢指针】快乐数
- vuejs之结合使用vue+element-ui搭建后台管理页面
- 【python-leetcode142-快慢指针】环形链表2
- 【python-leetcode141-快慢指针】环形链表
- python-快速排序
- 【python-leetcode75-双指针】颜色分类
- 【python-leetcode713-双指针】乘积小于k的子数组
- vuejs之构建简易音乐播放器
- vuejs小例子之天气查询
- 【python-leetcode259-双指针】三个数的最小和
- vuejs之vue.js+axios结合使用
- c语言之指向指针的指针