软件开发面试之数据库事务篇

不少的小伙伴正在准备或是即将准备后端开发的岗位,对于这个岗位而言数据库是必问的一个知识点,而数据库的事务和数据库的隔离级别又是问到数据库时必问的重点。小编从年初开始也是不断的再学习找工作的知识,在面过软件开发岗的几次面试中,数据库是每次基础面的必问知识,接下来的这篇文章我来给大家细说一下数据库事务的那些事。

文章目录:1. 数据库事务是什么?    1.1 事务的定义    1.2 事务的特点        1.2.1 原子性        1.2.2 一致性        1.2.3 隔离性        1.2.4 持久性    1.3 事务的状态2. 数据库隔离级别    2.1 Read Uncommitted        2.1.1 脏读    2.2 Read Commit        2.2.1 不可重复读    2.3 Repeatable Read        2.3.1 幻读    2.4 Serializable3. 总结

1. 数据库事务是什么?

所谓事务,就是要完成一件事情,在这个事情中包含了多个任务。

当所有的任务都执行成功,这个事情就是成功的:所有改动的数据生效。

当任意一个任务执行失败,这个事情就是失败的:所有改动的数据回退。

1.1 事务的定义

事务是数据库中一个单独的执行单元。当在数据库中更改数据成功时,在事务中更改的数据便会提交,不再更改,否则事物取消或回滚。数据库事务是为了保证在数据库更改失败的情况下还可以回到执行事务之前的状态。

SQL标准规定当一个SQL语句被执行,就隐含地开始了一个事务,事务最后被提交或回滚之后事务就结束,如果一个事务没有完成commit,其影响都可以被回滚,在断点和系统崩溃的情况下,回滚会在事务重启后执行。

每一个SQL语句默认为自成事务,且一旦执行完就提交。如果一个事务需要执行多条SQL语句,就必须关闭默认的每一个SQL语句自动提交。如果关闭自动提交也依赖于具体的SQL实现。也可以使用BEGIN或START TRANSACTION,显示地开启一个事务;

1.2 事务的特点

对于数据库事务,必须满足以下四种性质,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。即ACID四种属性。

1.2.1 原子性

原子性要求事务必须被原子性执行,即要么不执行(执行过程中出现错误,回滚事务),要么全执行(执行成果,提交事务)。避免执行一部分操作带来的错误。这个工作由事务管理部件处理。

1.2.2 一致性

一致性表示一个事务执行前后,数据库必须保证一致性的状态。数据库的一致性状态应该满足模式锁指定的约束,那么在完整执行该事物后数据库仍然处于一致性状态。

一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

案例:对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNT表中aaa和bbb的存款总额为2000元,即事务执行前后数据库的状态是一致的。

1.2.3 隔离性

当两个或多个事务并发执行时,为了保证数据之间的安全性,将一个事物内部的操作隔离起来,不被其他正在执行的事物看到。确保隔离性是并发控制部件的责任。

多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。

这指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。

当多个事务并发时,SQL Server利用加锁和阻塞来保证事务之间不同等级的隔离性。一般情况下,完全的隔离性是不现实的,完全的隔离性要求数据库同一时间只执行一条事务,这样会严重影响性能。想要理解SQL Server中对于隔离性的保障,首先要了解并发事务之间是如何干扰的。

1.2.4 持久性

也称永久性,事务完成以后,DBMS保证它对数据库中的数据的修改是永久性的,提交后不会被回滚。当系统或介质发生变化时,该修改也永久保持。确保持久性是数据库系统中恢复管理部件的责任。

事务的 ACID 特性概念简单,但不是很好理解,主要是因为这几个特性不是一种平级关系:

  • 只有满足一致性,事务的执行结果才是正确的。

  • 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。

  • 在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。

  • 事务满足持久化是为了能应对系统崩溃的情况。

1.3 事务的状态

事务必须属于以下五个状态之一。

① 活动状态:初始状态;事务执行时处于这个状态;

② 部分提交状态:最后一条语句执行之后;

③ 失败状态:发现正常的执行不能继续之后;

④ 中止状态:事务回滚并且已经恢复到事务开始执行之前的状态;

⑤ 提交状态:成功完成后。

事务进入中止状态之后可以选择重启事务或杀死事务。重启事务是仅当引起事务中止的是硬件错误或不是由事务的内部逻辑产生的软件错误时,重启事务看成是一个新的事物;杀死事务是由于事务的内部逻辑错误,只有重写应用程序才能改正,或者由于输入错误,或所需数据在数据库中没有找到。

注意:

BEGINSTART TRANSACTION:显示地开启一个事务;

COMMIT:也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;

ROLLBACK:有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

SAVEPOINT identifier:SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;

RELEASE SAVEPOINT identifier:删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

ROLLBACK TO identifier:把事务回滚到标记点;

SET TRANSACTION:用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

2. 数据库隔离级别

数据库有四种类型的事务隔离级别:不提交的读、提交的读、可重复的读、串行化。

隔离级别 读数据一致性 脏读 不可重复读 幻读
未提交读:Read uncommitted 最低级别 存在 存在 存在
已提交读:Read committed 语句级 避免 存在 存在
可重复读 :Repeatable read 事务级 避免 避免 存在
序列化:Serializable 事务级 避免 避免 避免

2.1 Read Uncommitted

一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。也称为脏读。

2.1.1 脏读

读脏数据指在不同的事务下,当前事务可以读到另外事务未提交的数据。例如:事务T1更新了一行记录的内容,但是并没有提交所做的修改。事务T2读取更新后的行,然后T1进行了回滚操作,取消了刚才所做的修改。现在T2读到的之前T1修改的行则是无效的。(一个事务读取了另一个事务未提交的数据)

2.2 Read Commit

一个事务在执行过程中可以看到其他事务已经提交的新插入的记录。也就是说一个事务从开始到提交之前对数据库做的修改对其他事务都是不可见的。但是其他事务可以修改某个事务正在读的行。因此,这一个隔离级别的设置解决了脏读的问题,但是避免不了不可重复读。

2.2.1 不可重复读

不可重复读指在一个事务内多次读取同一数据集合。在这一事务还未结束前,另一事务也访问了该同一数据集合并做了修改,由于第二个事务的修改,第一次事务的两次读取的数据可能不一致。例如:T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。

2.3 Repeatable Read

不能读取已由其它事务修改了但是未提交的行,其它任何事务也不能修改在当前事务完成之前由当前事务读取的数据。但是对于其它事务插入的新行数据,当前事务第二次访问表行时会检索这一新行。因此,这一个隔离级别的设置解决了不可重复读取的问题,但是避免不了幻读。

2.3.1 幻读

事务T1读取一条指定的Where子句所返回的结果集,然后事务T2事务新插入一行记录,这行记录恰好可以满足T1所使用的查询条件。然后T1再次对表进行检索,但又看到了T2新插入的数据。

2.4 Serializable

当数据库系统使用序列化隔离级别时,不能读取已由其它事务修改但是没有提交的数据,不允许其它事务在当前事务完成修改之前修改由当前事务读取的数据,不允许其它事务在当前事务完成修改之前插入新的行。一个事务在执行过程中完全感觉不到其他事务对数据库所做的更新。事务实际上以串行化方式运行。 这一个隔离级别的设置解决了幻读的问题,也是最高的隔离级别。

3. 总结

本文介绍了数据库事务是什么,事务的作用,事务有哪些特点,以及每个特点的含义是什么。在此基础上介绍了数据库的隔离级别,每一等级的隔离级别可以说是对数据库事务的具体体现。

最后数据库事务只是数据库方面最基础的一部分知识,除此之外,在数据库的索引、范式部分也是面试会经常问到的知识,在下一次的更新中我将为大家带来数据库索引相关的内容,希望大家喜欢。

参考引用:

https://blog.csdn.net/qq_41511678/article/details/82873030

https://github.com/CyC2018/CS-Notes


datagrid只传入了一部分的数据 未显示全_软件开发面试之数据库事务篇相关推荐

  1. 苹果电脑如何删除软件_软件开发公司误将委托人系统数据删除,责任如何认定?...

    杭州臣工环保科技有限公司(以下简称臣工公司)本是一家专业从事新风净化智能硬件设备研发.生产与销售的企业.因业务发展需要,臣工公司与广州机智云物联网科技有限公司(以下简称机智云公司)于2017年6月29 ...

  2. pb数据窗口显示图片_王者荣耀背后的腾讯自研数据库TcaplusDB实践

    关注腾讯开发者,一起用技术改变世界 <王者荣耀>是由腾讯游戏天美工作室开发的MOBA手游大作.作为全球用户数最多的手游,无论玩家什么时候上线.玩多久,王者荣耀总是如丝般顺滑.其实,每一次响 ...

  3. EasyUI的Datagrid在Dialog中加载数据不显示

    在第一次Dialog显示(open)的时候是正常的.调用Dialog的close再次调用open的时候就不行了. 关闭在打开的效果 代码具体如下 <!DOCTYPE html> <h ...

  4. 使用t-sql语句修改表中的某些数据及数据类型。_测试开发工程师数据库篇(一)...

    点击蓝字之后,我们就是好朋友了啦 15    数据库篇(一)  01事务概念及应用场景 事务是一组不可分割的mysql语句组,这些语句组要么全部执行成功,要么全部执行失败.事务的提出主要是为了解决并发 ...

  5. ad17编辑界面怎么检查未连线_软件账务处理流程之——凭证审核与检查

    金蝶是我们财务人非常熟悉的财务软件,但是我们很多财务人只在应用软件的时候还是会出现很多的问题,为了帮助大家更好地应用这个软件,今天就来和大家讲讲关于金蝶软件凭证审核与检查的一些基本处理流程. 凭证审核 ...

  6. android 保存数据到setting中_文章如何保存在数据库中

    当我们打开央视新闻网站时,能看到很多丰富多彩的文章,那么这些文章是怎么保存在数据库中的呢?或者说要怎样能实现类似的效果? 如果你了解过网页的话,应该知道通过html的p.ul.img.div等元素的合 ...

  7. mysql数据没有同步更新_解决MySQL的主从数据库没有同步的两种方法

    问题 今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常. show master statu ...

  8. pb数据窗口显示图片_中科院发布地球大数据共享服务平台 5PB数据现可共享

    图为数据共享服务系统的界面 中国科学院1月15日召开新闻发布会,对外发布其A类战略性先导科技专项"地球大数据科学工程"2018年度的重大成果--地球大数据共享服务平台. 记者从会上 ...

  9. 低版本mysql数据导入高版本_将高版本mysql数据库的数据导入低版本mysql中

    前言 最近做了个网站,准备放到虚拟主机上的时候,发现本地数据库是mysql5.6,服务器上的mysql是5.0的.于是尝试导出数据,结果,导入的数据不是出错,就是各种乱码.折腾了好久之后,终于找到了解 ...

最新文章

  1. [转载] Maven类包冲突终极三大解决技巧 mvn dependency:tree
  2. Android Studio 第六十五期 - Android业务组件库
  3. Linux创建线程读取双口数据,linux环境下读写一次双口ram尽然要十几个毫秒。(附驱动代码)...
  4. 为什么停车类APP看似缺口巨大却没有成长起来?
  5. ubuntu如何禁用更新?
  6. hp服务器330g6怎么安装系统,Hp DL380 g6 安装WIN2003的图文方法
  7. QT的QDesignerCustomWidgetCollectionInterface类的使用
  8. python封装类连接mysql数据_python操作mysql数据库基本类封装
  9. php 文件保存函数,php 写入和读取文件函数
  10. Java基础入门笔记-构造方法的继承
  11. Python数据分析教程:Numpy 中不得不知的4个重要函数
  12. 初中计算机成绩评定方案,初中信息技术学科评价方案
  13. Python:从UCI数据库下载数据集到内存
  14. GAN的评价指标IS和FID
  15. 2020年408真题_2020年港澳台联考真题——地理!
  16. 2010,有关中国的几个瞬间
  17. 在excel/wps中如何实现批量翻译
  18. python display 报错_Python中的函数(三)
  19. 58同城一面【前端】
  20. 传奇玩家申请怪物攻城脚本

热门文章

  1. npm和yarn的区别,我们该如何选择?
  2. 找到下一个“元素节点”通用函数
  3. 爱创课堂每日一题第二天8/24日 Quirks模式是什么?它和Standards模式有什么区别?...
  4. python-assert
  5. 100万“愤怒的小鸟”:中国手机开发者生存调查
  6. 误删/etc/passwd的修复
  7. Android 读取文件内容
  8. Ext.form 表单为什么第二次就不正常显示
  9. 什么是Sentinel?它能做什么
  10. python列表按照批次分配数据(亲测)