数据库事务

一、概述

  1. 事务的概念

    1. 事务是指逻辑上的一组操作 , 组成这组操作的各个单元 , 要么全部成功 , 要么全部失败 。 如:银行转账。。

      1. 转账核心操作其实就是两条sql ,两条都执行成功才算成功 , 一条失败则转账失败 。 决不允许一部分成功一部分失败的情况
    2. 关系型数据库可以事务操作保证事务的特性。

二、 管理事务

  1. 数据库默认就有事务 , mysql中默认一条语句独占一个事务
  2. 也可以通过手动控制事务:
    1. sql控制事务

      1. start transaction; #开启一个事务, 这条语句后面的所有sql都将处在同一个事务当中 。这些sql都不会立即起作用 — 没有改变真正改变数据库中数据的操作 。
      2. commit;# 提交事务 , 这个事务中的所有sql对数据库的影响立即发生 , 真正改变数据库的数据 。 未提交之前 , 在表面上发生改变事务内部的数据 , 但是实际上并没有对数据库的数据产生影响。
      3. roilback;# 回滚事务,撤销这个事务中的所有的操作可能对数据库 产生的影响。
    2. JDBC中控制事务
      1. conn.setAutoCommit(false);//关闭jdbc自动提交 ,开启jdbc的事务功能 , 接下来在这个连接执行的所有sql都将处在同一个事务中
      2. conn.commit() //提交事务 , 将这个连接上执行的事务提交 , 对数据库产生影响
      3. conn.roliback() //回滚事务 , 取消这个连接上的执行的事务
      4. SavePoint sp = conn.setSavePonit(); //设置回滚点 , 相当于游戏中的存档
      5. conn.roliback(sp);//回滚到回滚点 , 注意:回滚到回滚点时 , 回滚点之前的代码仍然是未提交的状态 , 如果希望对数据库产生影响仍然需要进行提交操作

三、事务的四大特性 — ACID

  1. 原子性 : 事务中的一组操作是不可分割的一个整体 , 要么一起成功 , 要么一起失败
  2. 一致性 : 事务前后无论事务是否成功 , 数据库都应该保持一个完整性的状态
    1. 数据库中数据的完整性 : 数据库中数据是业务完整的(符合业务逻辑)且是约束完整的(符合数据库中所定义的所有约束)。
  3. 隔离性 : 多个事务之间应该互相隔离 , 互不影响 。
  4. 持久性 : 一个事务一旦完成 , 对数据库的影响是永久性的 , 无论发生什么情况 , 这种影响都不会被取消 。

四、隔离性的问题:

  1. 方案一 : 加锁 – 保证同一时间内只能有一个操作数据 – 完美的保证隔离性 – 但是这样一来数据库就相当于单线程的状态下 , 同一时间只能有一个人操作数据库 , 效率牺牲过大 。
  2. 方案二 : 现实生活中 , 并不是所有场景下都需要 那么严格的隔离 , 在不同的业务场景下 , 对隔离的要求是不同的 , 数据库的设计者并没有将隔离性写死 , 而是提供了不同的选项 , 数据库使用者根据自身需求选择对应的选项 , 选择相应的隔离能力和数据库的性能 。 通过这些选项 , 数据库 的使用者可以在数据库的性能和隔离性之间做一个权衡

五、四大隔离级别

  1. Read uncommitted – 读未提交

    1. 数据库不保证任何的事务特性 , 可能出现脏读、不可重复读、幻读的问题。隔离性最低 ,但是性能最高
    2. 脏读: 一个事务读取到了另一个事务未提交的数据。
  2. Read committed – 读已提交
    1. 保证部分的隔离 , 可以防止脏读问题 ,但是具有不可重复读 和 幻读的问题 。
    2. 不可重复读:一个事务读取到另一个事务已经提交的数据
  3. Repeatable read – 可重复读
    1. 保证了部分的隔离 , 可以防止脏读、不可重复读的问题 , 但是具有幻读的问题
    2. 幻读: 一个事务读取全表数据时, 读取到另一个事务向表中新增或删除操作提交后的数据。
      1. 幻读问题有可能出现 , 有可能不出现 , 概率很低。 是由于快照造成的
  4. Serializable – 可序列化
    1. 保证了完全隔离 , 可以防止脏读 , 不可重复读 , 幻读的问题 , 本质上是 通过锁实现的 。
  5. 从安全性来说:serializable >Repeatale read > Read committed > Read uncommittes
  6. 从效率来说:serializable

六、隔离级别的操作

  1. 查看数据库隔离级别:

    select @@tx_isolation;
    
  2. 设置数据库隔离级别

    set [session/globle] transaction isolation level ****;
    session表示只设置当前 客户端的隔离级别 , 立即生效 ; globle表示设置数据库的默认隔离级别 , 但是不会立即生效 , 需要从启客户端
    

七、数据库中的锁机制

  1. 数据库中是有锁的 , 但是锁如果设计不好对效率的影响非常大 , 所以数据库的设计者对锁做了详细的设计

    1. 两个查询 — 没有必要排斥
    2. 两个修改 — 必须要排斥
    3. 一个查询 , 一个修改 — 根据具体场景加锁 , serializable级别 下需要排斥 , 其他隔离级别下不需要
  2. 共享锁
    1. 共享锁和共享锁可以共存 , 共享锁和排它锁不能共存
    2. 在非serializable级别中查询不加任何锁 , 在serializable级别中查询加共享锁
  3. 排它锁
    1. 排它锁和任何锁不能共存
    2. 在任意隔离级别下增删改都加排它锁
  4. 案例:

    非serializable级别下操作 非serializable级别下操作 结果
    查询 不加任何锁 查询 不加任何锁 共存
    增删改 排它锁 查询 不加任何锁 共存
    增删改 排它锁 增删改 排它锁 排他
    serializable 非serializable 结果
    查询 共享锁 查询 不加任何锁 共存
    增删改 排它锁 查询 不加任何锁 共存
    增删改 排它锁 增删改 排它锁 排他
    serializable serializable 结果
    查询 共享锁 查询 共享锁 共存
    查询 共享锁 增删改 排它锁 排他
    增删改 排他锁 增删改 排它锁 排他
  5. 死锁

    1. 当两边都是serializable隔离级别时, 两边都先进行查询,这时两边都是共享锁, 再尝试修改 企图将共享锁升级为排它锁, 则造成了死锁的现象, 互相等待对方释放共享锁 , 都无法执行 , 造成死锁。
    2. 两种解决办法:
      1. 提前避免死锁的发生
      2. mysql没有避免死锁 , 尝试检测死锁 ,发现死锁的时候 ,错误推出一方 , 执行另一方的方式解决了死锁。

大数据WEB阶段(十八)数据库事务相关推荐

  1. 大数据WEB阶段(八)Tomcat服务器安装与详解、HTTP协议详解

    Tomcat 一. 服务器 动态web资源运行需要服务器环境 客户端发送请求到服务器 , 服务器调用动态web资源 Servlet容器 . web容器 .服务器 Servlet容器 java中的动态资 ...

  2. 大数据WEB阶段 TransientDateAccessResourceException

    大数据WEB阶段 TransientDateAccessResourceException 一 . 分析 如果数据库保存的字段有时间 , 但是没有给该字段赋值时 ,则该字段默认是0000-00-00 ...

  3. 大数据WEB阶段(十九)Threadlocal

    ThreadLocal 一.ThreadLocal概述 本地线程变量 本质上是一种利用线程的执行由程序的上游向下游传递信息的机制 Thread对象内置了一个Map来存取消息 , 但是这个 Map外界无 ...

  4. 大数据WEB阶段总结

    一.概述 HTTP协议 web容器 - Tomcat 静态web资源 - 本质上是文件 html css js 图片 音频 视频 flash- 动态web资源 - 本质上是程序 Servelt JSP ...

  5. 大数据WEB阶段(九)Servlet+Request

    Servlet与Request 一.概述 Servlet 是sun公司提供的一门用于开发动态web资源的技术 按照这套规范写出来的servlet可以放置在web应用中在servlet容器中运行 . 开 ...

  6. 大数据WEB阶段 (六)MySql详解(一)

    MySql(二) 一.概述 什么是数据库 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,简而言之就是存储数据的仓库. 数据库的分类 层次式数据库.网络式数据库.关系型数据库 数 ...

  7. 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...

  8. 客快物流大数据项目(二十八):大数据服务器环境准备

    目录 大数据服务器环境准备 一.服务器规划 二.Linux虚拟机环境搭建

  9. 大数据WEB阶段(十二)会话技术、Cookie、Session及两者的区别

    会话技术 – Cookie与Session及其两者的区别 (一)会话技术 一.概述 1. 一个浏览器为了实现某一个功能对服务器产生了多次请求响应.从第一个请求开始访问服务器,会话开始,到最后一个页面访 ...

最新文章

  1. shell之冒号的作用
  2. 怎样解决VMware虚拟机无法连接外网问题
  3. python 三角函数
  4. 迁移到云端,千万别犯这3个大错误!
  5. 石家庄市职称计算机,河北石家庄2010年职称计算机考试报名通知
  6. smb(ms17-010)远程命令执行之msf
  7. Spring整合Mybatis-完成用户登录
  8. 打印pdf就一页_Excel表格打印技巧汇总,看完才发现,你连基础打印技巧都不知道...
  9. JavaWeb 命名规则
  10. eclipse导入项目发生的Android Private Libraries丢失
  11. LoadRunner常见错误代码解决方案
  12. Oracle Temp表空间切换
  13. LIVE2D模型加载软件Live2DViewerEX(steam),LIVE2Dviewer(LIVED2D社区),LIVE2Dviewer(github),Ppet(github)让你的老婆活灵活现
  14. 整理备忘:【已解决】VMware虚拟机提示“锁定文件失败 打不开磁盘”
  15. [译] 海量视频时代下的内容发现之旅
  16. std::numeric_limits使用
  17. X Server移植指导之三 输出层移植 (XServer Porting Guide)
  18. 数据即服务(DaaS)
  19. 使用kubeadm安装k8s集群的完整步骤(k8sv15.1)
  20. eclipse不提示错误问题

热门文章

  1. 一个简单的TCP服务器
  2. nginx 日志获取不到远程访问ip问题解决
  3. [leetcode]Edit Distance
  4. M2第三天DailyScrum——PM(李忠)
  5. Silverlight3 Tools Download link
  6. html发送十六进制字符数组,十六进制数组怎么转换成字符串数组?
  7. C语言学习之打印菱形
  8. C语言学习之输出10个整数中的最大值及其下标、最小值及其下标
  9. MongoDB 索引-9
  10. using可以用于释放操作,相当于Dispose()