事务概念

事务:

  • 构成单一逻辑单元的操作集合.
  • 是访问并可能更新各种数据项的一个程序执行单元(unit).
  • 事务是不可分割的, 要么执行全部内容, 要么一个也不执行.

ACID特性:

  • 原子性(atomicity): 事务的所有操作在数据库中要么全部正确反映出来, 要么完全不反映.保证原子性的基本思路: 对于事务要执行写操作的数据项, 数据库系统在磁盘上记录其旧值. 这个信息记录在称为日志的文件中. 如果事务没能完成它的执行, 数据库系统从日志中恢复旧值, 使得看上去事务从未执行过. 保证原子性是数据库系统的责任, 这项工作由称为恢复系统(recovery system)的一个数据库组件处理.
  • 一致性(consistency): 隔离执行事务时(即:在没有其他事务并发执行的情况下)保持数据库的一致性.数据库总是从一个一致性状态转换到另外一个一致性状态.
  • 隔离性(isolation): 尽管多个事务可能并发执行, 但系统保证, 对于任何一对事务A和B, 在A看来, B或者在A开始之前已经完成执行, 或者在A完整之后开始执行. 因此, 每个事务都感觉不到系统中有其他事务在并发地执行.事务的隔离性确保事务并发执行后的系统状态与这些事务以某种次序一个接一个的执行后的状态是等价的.确保隔离性是数据库系统中称为并发控制系统(concurrency-control system)的部件的责任.
  • 持久性(durability): 一个事务成功完成后, 它对数据库的改变必须是永久的, 即使出现系统故障.可以通过确保以下两条中的任何一条来达到持久性(同样由恢复系统保证持久性):事务做的更新在事务结束前已经写入磁盘.有关事务已执行的更新信息已写到磁盘上, 并且此类信息必须充分, 能让数据库系统出现故障后重新启动时重新构造更新.

1.2.2事务原子性和持久性

事务状态:

  • 活动的(active): 初始状态, 事务执行时处于这个状态.
  • 部分提交的(partially committed): 最后一条语句执行后.
  • 失败的(failed): 发现正常的执行不能继续后.
  • 中止的(aborted): 事务回滚并且数据库已恢复到事务开始前的状态后.
  • 提交的(committed): 事务成功完成后.

1.2.3事务隔离性

可串行化(serializable): 在并发执行中, 通过保证所执行的任何调度的效果都与没有并发执行的调度效果一样, 则可以确保数据库的一致性. 也就是说: 调度应该在某种意义上等价于一个串行调度.

1.2.4可串行化

冲突(conflict): 当I和J是不同事物在相同数据项Q上的操作, 并且其中至少有一个是write(Q)指令时, 则I和J是冲突的.

冲突等价(conflict equivalent): 如果调度A可以经过一系列非冲突指令交换转换成B, 称A和B是冲突等价的.

冲突可串行化(conflict serializable): 若一个调度S与一个串行调度冲突等价, 则称调度S是冲突可串行化的.

1.2.5可恢复性

  1. 可恢复调度(recoverable schedule): 应满足: 对于每对事务A和B, 如果B读取了之前由A所写的数据项, 则A先于B提交.
  2. 无级联调度(cascadeless schedule)级联回滚(cascading rollback): 因单个事务故障导致一系列事务回滚的现象.无级联调度: 对于每对事务A和B, 如果B读取了先前由A所写的数据项, 则A必须在B这一读操作前进行提交.每一个无级联调度也都是一个可恢复调度.
  3. 事务隔离级别可串行化(serializable): 通常保证可串行化调度. 是最高的隔离级别, 通过强制事务串行执行, 避免了幻读的问题. 简单来说: 可串行化会在读取的每一行数据上都加锁, 所以可能导致大量的超时和锁争用的问题. 实际应用中, 很少考虑这个级别, 只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑采用该级别.可重复读(repeatable read):只允许读取已提交数据, 而且在一个事务两次读取一个数据项期间, 其他事务不得更新该数据.解决了脏读的问题. 该级别保证了在同一个事务中多次读取同样记录的结果是一致的.但无法解决幻读(phantom read)的问题. 幻读: 指的是当某个事务在读取某个范围内的记录时, 另外一个事务又在该范围内插入了新的记录, 当之前的事务再次读取该范围的记录时, 会产生幻行(phantom row). InnoDB存储引擎通过多版本并发控制(MVCC)解决了幻读的问题. 可重复读是MySQL的默认事务隔离级别.已提交读(read committed): 只允许读取已提交数据, 但不要求可重复读. 一个事务开始时,只能"看见"已经提交的事务所做的修改. 换句话说: 一个事务从开始直到提交之前, 所做的任何修改对其他事务都是不可见的. 也叫做不可重复读(nonrepeatable read), 因为两次执行同样的查询,可能会得到不一样的结果.未提交读(read uncommitted): 允许读取未提交读. 事务可以读取未提交的数据, 这种也被称为脏读(dirty read). 实际应用中一般很少使用.以上所有隔离级别都不允许脏写(dirty write), 即如果一个数据项已经被另外一个尚未提交或中止的事务写入, 则不允许对该数据项执行写操作.

1.2.6死锁

死锁(dead lock): 指两个或多个事务在同一资源上相互占用, 并请求锁定对方占用的资源, 从而导致恶性资源竞争的现象.

  • 当多个事务试图以不同的顺序锁定资源时, 就可能会产生死锁.
  • 多个事务同时锁定一个资源时, 也会产生死锁.

1.2.7事务日志

事务日志: 使用事务日志, 存储引擎在修改表的数据时, 只需要修改其内存拷贝, 再把该修改行为记录到持久在硬盘上的事务日志中, 而不用每次都将修改的数据本身持久到磁盘.

特点: 事务日志采用追加的方式, 因此写日志的操作时磁盘上一小块区域内的顺序IO, 而不像随机IO需要在磁盘的多个地方移动磁头, 所以采用事务日志的方式相对来说会很快.

预写式日志(write-ahead logging): 事务日志持久以后, 内存中被修改的数据在后台可以慢慢地刷回到磁盘. 所以修改数据需要写两次磁盘.

系统崩溃情况: 如果数据的修改已经记录到事务日志并持久化, 但数据本身还没有写入到磁盘, 此时系统崩溃, 存储引擎在重启时能够自动恢复这部分修改的数据.

mysql conflict语句_详细解读MySQL事务相关推荐

  1. mysql mdl 锁_详细分析mysql MDL元数据锁

    前言: 当你在MySQL中执行一条SQL时,语句并没有在你预期的时间内执行完成,这时候我们通常会登陆到MySQL数据库上查看是不是出了什么问题,通常会使用的一个命令就是 show processlis ...

  2. mysql安装原理_全面解读MySQL主从复制,从原理到安装配置

    为什么需要主从复制? 1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了 ...

  3. 深入理解MySQL主从原理_详细分析MySQL主从复制

    前言: 在MySQL中,主从架构应该是最基础.最常用的一种架构了.后续的读写分离.多活高可用架构等大多都依赖于主从复制.主从复制也是我们学习MySQL过程中必不可少的一部分,关于主从复制的文章有很多, ...

  4. mysql打印语句_抓取mysql、redis、mongodb、http等协议并打印语句

    我们在开发过程中经常会请求mysql,redis,mongodb等数据库,调试程序一般会打印出相应的数据库语句,但是有的时候我们用一些很笨重的框架,因为封装程度比较高打印一个sql语句都会非常麻烦,而 ...

  5. 查一个字段中字符集超过30的列_详细解读MySQL的30条军规

    一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...

  6. mysql的count函数类型是什么意思_详细解读MySQL中COUNT函数的用法

    MySQL的COUNT函数是最简单的功能,非常有用的计算,预计由一个SELECT语句返回的记录数. 要了解COUNT函数考虑的EMPLOYEE_TBL的的表具有以下记录: mysql> SELE ...

  7. mysql 监控语句_做一个mysql监控系统应该掌握的一些基本语句

    很多系统需要一个MYSQL的监控,查看MYSQL的一些变量配置,吞吐量,连接数,QPS, TPS,慢查询等.当然有一些开源的工具可以满足这些需求,如果是要自己做呢.下面归纳了一些常用监控的SQL语句, ...

  8. mysql执行语句_实时查看MySQL执行的语句

    我们在追查MySQL问题和性能调优时,有时希望看到当前都有哪些命令正在被执行,让我们迅速找到热点命令.下面我们就来介绍下如何查看当前正在执行的MySQL语句. 日志LOG 我们之前在 用service ...

  9. mysql修改语句_序言:MySQL与Navicat安装Tips

    一.数据库相关的基础知识 1.1 数据分析师主要集中在select高效查找上,纯粹的底层运维就不需要太关注: 1.2 数据库与表 类比sheet是表,整个Excel文件是一个数据库: 1.3 行与列 ...

最新文章

  1. php redis并发读写,PHP使用Redis实现防止大并发下二次写入的方法
  2. springboot2.1.1连接数据库失败的原因查找
  3. [BZOJ5329][Sdoi2018]战略游戏 圆方树+虚树
  4. poj-3185-开关问题
  5. OFDM子载波频率 知乎_SDR (软件无线电)
  6. imx6q 转换LVDS为VGA输出
  7. Java 蓝桥杯 基础练习 01字串(循环)
  8. 补充学习2021.7.21—动态水波进度条
  9. MES系统功能在石油化工行业的应用
  10. CSS中的BFC规范(块级格式化上下文)
  11. 预告来袭:【豆冰冰】发.售,现.金.抽.奖等你来拿
  12. Python编程之md5加密和sha1加密
  13. git中patch的用法
  14. 上传多个文件html文件内容吗,html5 – 使用Rook上传多个文件
  15. 规范化(标准化)数据的方法
  16. ConnectedLife与Ocean Protocol合作对抗帕金森病
  17. 西门子逻辑运算指令_西门子S7-300系列PLC逻辑运算指令的使用方法是什么?
  18. 各大银行借记卡取款手续费比较表
  19. 游戏制作行业为什么使用TGA格式的贴图而不使用PNG格式
  20. 北京市家庭居室装饰装修工程施工合同

热门文章

  1. Android 摇一摇(二)
  2. python用户标识符条件_使用sum(if…)或条件语句操作两个数据集,这些语句没有hivehadooppython的公共标识符...
  3. 超融合架构的优缺点_知道 超融合基础架构吗
  4. 微课|中学生可以这样学Python(例7.3):栈
  5. openstack常用运维命令_OpenStack运维指南pdf
  6. sql decimal 转string_音频怎么转文字?这个软件带你体验飞一般的感觉
  7. python map 函数使用
  8. mysql5启动错误1067_win7 64位 mysql5.5启动服务报错无法启动,错误1067
  9. java接口自动化+博客园_java+接口自动化+eclipse之-----环境搭建
  10. centos7查看mysql进程显示端口_CentOS查看进程端口号以及kill操作