首页 > 数据库 >数据库———事务及bug的解决

数据库———事务及bug的解决

时间:2024-09-13 09:25:12浏览次数:10  
标签:事务 数据库 上锁 服务器 执行 数据 bug

一:事务

1:场景引入

张三在银行账户中存有1000元,李四存有500元,这时张三要给李四支付500元,执行sql语句

①:update account set balance = balance -500 where name = '张三';

②:update account set balance = balance + 500 where name = '李四';

想象一下,如果在sql语句①执行完之后,数据库挂了,那不仅张三被扣了钱,李四还没有收到钱,问题就麻烦了

2:“回滚”

此时就引入了事务这一概念,“要么条sql语句都不执行,要么都执行”。

注:这里的不执行其实还是执行了的,“回滚”(rollback),恢复回去,这里涉及到数据库的一种恢复机制(undo log , redo log)

3:恢复机制(undo log,redo log)

读法:(安度  老哥  , 瑞都 老哥)哈哈

恢复机制会在数据库运行的时候,把你的操作写成日志的形式(println)保存到文件中,当数据库挂了之后,重启数据库,数据库会检查日志中是否有只执行了一半或者没有执行完的操作,如果有,就会把之前的操作进行回滚

优缺点:事务保证了数据的准确性,但是牺牲了执行效率

4:事务的特点

(1)原子性:事务的出现,本质就是将“操作”进行打包(这是事务的核心特性)

(2)一致性:是原子性的延伸,当数据库出现问题的时候,避免出现像上述钱不翼而飞的情况,即要么都执行,要么都不执行,另一方面我们也会添加一些约束条件,来避免数据出现一些非法的情况

(3)持久性:事务的操作是被写入硬盘的(持久保存的),电源关机,重启程序,这些修改的额操作都不会消失,(数据库本身就是为了持久化存储而生的)

(4)可隔离性:当多个事务并发操作时,可能会带来一些情况,我们可以通过隔离性来进行权衡,偏向数据的准确性多一点,或者偏向执行效率

二:并发执行事务及Bug详解

1:场景引入

数据库是cs结构的,一个数据库会面向多个服务器,当多个服务器同时向数据库发出事务请求,这就叫做并发执行事务。如果多个服务器请求的是修改不同的表那还好,如果是修改相同的表的话就会出现一些Bug

Bug(1):“脏读”问题

①场景引入

服务器A:对数据库发出事务请求,修改了某个数据(写),但是还没有“提交”(提交的意思就是,告诉数据库,我的操作OK了,结束了)

服务器B:同时对数据库进行读取,读取了这个数据,但是这个数据并不一定是准确的,因为A后续还可能对数据进行修改,所以B的这一次读取操作就是“脏读”

通俗解释:考试中张三在写卷子,我过去瞄了一眼他写的答案,但是张三后面又修改成了正确答案,导致我抄的答案其实是错误的

②解决思路(给“写”上锁)

给操作“上锁”,在A对数据库操作的时候,(上锁),其它服务器不能访问,等到A的操作完成之后(解锁),后面的服务器才可以进行操作(看)

注意:这里的上锁是针对(写操作)服务器A

通俗解释:就是去上厕所,一个坑只能一个人上,坑里的人开门出来了,你才能进去

Bug(2):不可重复读

①场景引入(沿用Bug1的场景)

服务器A在访问(写)数据库时候上锁了,服务器B在A结束操作之后开始第一次读取,此时进来一个服务器C(写)访问服务器,修改了数据,服务器B第二次读取数据发现:嘿怎么两次读取的数据不一致???

注:上锁是针对,服务器在数据库(写)修改数据的情况,没说你在读的时候,我不能修改呀!!

②解决思路(给“读”上锁)

在服务器“读”的时候也进行上锁。

不难发现Bug(2)和Bug(1)很像,就是(1)的一个延伸。

Bug(3):幻读

①场景引入(沿用Bug2的场景)

服务器A上锁修改数据库数据,解锁后,服务器B开始第一次上锁读取,此时服务器C不修改数据了,C新增了一个数据,B第二次读取发现“结果集”发生了变化,王德发??

解释“结果集”:就是类似表的行数

②解决思路()

把并行事务串口化,不再进行任何并行开发,使用串口开发,一项事务执行完毕后,再继续下一项(实际开发中并行,串行视情况而定)

三:隔离级别

上述的的三种bug要根据实际开发情况来判定到底是否为bug,有的场景更注重与效率,有的场景更注重数据的准确性

1:read uncommitted(读未提交)

并行程度(高),隔离级别(低),效率(高),数据的准确性(低),可能会触发:“脏读”,“不可重复读”,“幻读”

2:read committed(读已提交)

并行程度(中),隔离级别(中),效率(中),数据的准确性(中),可能会触发:“不可重复读”,“幻读”

3:repeatable read (可重复读)

并行程度(低),隔离级别(高),效率(低),数据准确性(高),可能会触发:“幻读”

4:serializable(串行化)

并行程度(无了),隔离级别(最高),效率(最低),数据准确性(最准)

四:实际运用(简述)

1:start transaction(执行事务)

2:sql1,sql2,sql3语句进行打包

3:commit(告诉服务器,事务执行完毕)

4:roolback(告诉服务器,要进行回滚即开启事务后,执行的sql语句恢复回去)

roolback一般不会在控制台中执行,一般是在java代码中实现,先在代码中开启事务,控制执行sql语句(打包提交),结果某条sql语句报错,catch捕获异常,并且使用rollback(回滚)

标签:事务,数据库,上锁,服务器,执行,数据,bug
From: https://blog.csdn.net/2301_80133875/article/details/142180255

相关文章

  • 【含文档】基于Springboot+Vue的同城上门喂遛宠物系统的设计与实现(含源码数据库)
    1.开发环境开发系统:Windows10/11架构模式:MVC/前后端分离JDK版本:JavaJDK1.8开发工具:IDEA数据库版本:mysql5.7或8.0数据库可视化工具:navicat服务器:SpringBoot自带apachetomcat主要技术:Java,Springboot,mybatis,mysql,vue2.视频演示地址3.功能系统中......
  • 【含文档】基于Springboot+Vue的大学生计算机基础网络教学系统管理(含源码数据库)
    1.开发环境开发系统:Windows10/11架构模式:MVC/前后端分离JDK版本:JavaJDK1.8开发工具:IDEA数据库版本:mysql5.7或8.0数据库可视化工具:navicat服务器:SpringBoot自带apachetomcat主要技术:Java,Springboot,mybatis,mysql,vue2.视频演示地址3.功能这个系......
  • PbootCMS无缝sqlite数据库转mysql数据库
    将PbootCMS的SQLite数据库无缝转换为MySQL数据库,可以遵循以下步骤。请注意,这里所说的“无缝”转换是指尽可能减少数据丢失和格式错误,但仍然需要确保转换后的数据能够正常工作。以下是详细的转换步骤:1.导出SQLite数据库打开SQLiteStudio或类似工具:使用SQLiteStud......
  • 未检测到您服务器环境的sqlite3数据库扩展,请检查php.ini中是否已经开启该扩展
    当你遇到“未检测到您服务器环境的sqlite3数据库扩展,请检查php.ini中是否已经开启该扩展”的提示时,这表明PHP当前的安装环境中没有启用SQLite3支持。SQLite3是一个轻量级的嵌入式数据库引擎,它通常用于不需要完整服务器端数据库解决方案的应用场景。解决方法1.检查 ph......
  • 如何在删除ibdata1和ib_logfile的情况下恢复MySQL数据库
    昨天,有个朋友对公司内部使用的一个MySQL实例开启binlog,但是在启动的过程中失败了(他也没提,为何会失败),在启动失败后,他删除了ibdata1和ib_logfile,后来,能正常启动了,但所有的表通过showtables能看到,但是select的过程中却报“Tabledoesn'texist”。于是,建议他试试可传输表空间。同......
  • 十,Spring Boot 的内容协商的详细剖析(附+Debug调试说明)
    十,SpringBoot的内容协商的详细剖析(附+Debug调试说明)文章目录十,SpringBoot的内容协商的详细剖析(附+Debug调试说明)1.基本介绍2.准备工作3.内容协商的本质4.内容协商:注意事项和使用细节5.总结:6.最后:1.基本介绍根据客户端接收能力不同,SpringBoot返回不......
  • 数据库tips17
    (十)、约束及索引类型约束的作用是为了防止可预见的错误的数据进入数据库中,是保障数据一致性的一种机制。UNIQUE约束是列级约束,表示关系中的记录在该列上的取值不重复。索引是通过建立索引列上的索引表,索引表中的査找项是索引列上的所有值的排序或散列(目的是为了快速查找),索引表中......
  • 1765asp.net古镇旅游网站VS开发sqlserver数据库web结构c#编程web网页设计
    博主介绍:专注于Java.net phpphython 小程序等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作☆☆☆精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟我的博客空间发布了1000+毕设题目方便大家学习使用感兴趣的可以先收藏起来,还有大家在......
  • Springboot点餐系统jl9ml(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着信息技术的飞速发展和餐饮行业的日益繁荣,传统的点餐方式已难以满足现代消费者对于便捷性、高效性和个性化服务的需求。因此......
  • Springboot大学生志愿者服务智慧管理系统094zx程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着社会的快速发展,大学生志愿者服务已成为连接校园与社会的重要桥梁,对促进青年成长、服务社会发挥着不可估量的作用。然而,传统......