数据库关于事务的详解分析(全)包含面试常问的细节
目录
- 前言
- 1. 定义
- 2. 四个特性(ACID)
- 3. 面临的问题
- 4. 四个隔离级别
- 5. 四个基本术语
- 6. 实战
前言
在敲代码的时候,提交事务、事务回滚等,事务二字确官方笼统,不知道具体什么意思
这篇文章将为你解答疑惑
具体为什么需要事务
有了事务
事务代表(一组操作,可以是SQL语句或者代码),如果其中一个操作不成功,这些操作都不会执行,前面执行的操作也会回滚原状态,用来保证数据的一致性和完整性。
保证数据的一致性,保证数据不会出错
1. 定义
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。
事务的提交是指事务里的所有操作都正常完成。
事务的回滚是指程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为
2. 四个特性(ACID)
原子性(atomicity)
要么都成功,要么都失败一致性(consistency)
事物前后的数据完整性要保证一致
比如开始1000块钱,后面转账结束了,也得是1000块钱。持久性(durability)
事物一旦提交则不可逆,被持久化到数据库中。隔离性(isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,
不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
3. 面临的问题
并发事务处理带来的问题
脏读:
指一个事务读取了另外一个事务未提交的数据。不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)虚读(幻读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致
更新丢失(Lost Update)
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题――最后的更新覆盖了由其他事务所做的更新。
如果在一个程序员完成并提交事务之前,另一个程序员不能访问同一文件,则可避免此问题。
脏读(Dirty Reads)
一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做”脏读”。
一句话:事务A读取到了事务B已修改但尚未提交的的数据
,还在这个数据基础上做了操作。此时,如果B事务回滚,A读取的数据无效,不符合一致性要求。
不可重复读(Non-Repeatable Reads)
一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读”。
一句话:事务A读取到了事务B已经提交的修改数据,不符合隔离性。
幻读(Phantom Reads)
一个事务接相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读“。
一句话:事务A读取到了事务B体提交的新增数据,不符合隔离性。
多说一句:幻读和脏读有点类似,
脏读是事务B里面修改了数据,
幻读是事务B里面新增了数据。
注意不可重复读和虚度的区别
不可重复读是同一个事务的多次读取而导致信息不一致
虚度是读取到了其他人的信息而导致信息不一致
简单的说:
脏读是事务B里面修改了但未提交的数据,
,A读取到了不可重复读是事务B里面修改了但提交了的数据
,A读取到了幻读是事务B里面新增了但已经提交的数据。
,A读取到了
4. 四个隔离级别
”脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。
读数据—致性及允许的并发副作用(隔离级别) | 读数据一致性 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
未提交读(Read Uncommitted) | 最低级别,只能保证不读取物理上损坏的数据 | 是 | 是 | 是 |
已提交读(Read committed) | 语句级 | 否(解决脏读已经提交的问题) | 是 | 是 |
可重复读(Repeatable read) | 事务级 | 否 | 否(解决了只读一次的效果) | 是 |
可序列化(serializable) | 最高级别,事务级 | 否 | 否 | 否 |
最高的隔离级别。会强制事务串行执行,简单来说,会在读取(读锁)的每一行数据上都加锁,一般来说在多线程场景下,性能低下。
数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大
,因为事务隔离实质上就是使事务在一定程度上“串行化”进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏感,可能更关心数据并发访问的能力。
- 常看当前数据库的事务隔离级别:
show variables like 'tx_isolation';
系统默认是可重复读
如上表格,可重复读解决了脏读和可重复读的问题,而一般又采用了MVVC多版本
并发控制来解决幻读的问题,所以在效率和ACID综合考虑下是相对较好的一个隔离级别选择
5. 四个基本术语
关于事务的四个基本术语
- 开启事务(Start Transaction)
- 事务结束(End Transaction)
- 提交事务(Commit Transaction)
- 回滚事务(Rollback Transaction)
关于事务的类型
显示事务
手动提交或回滚;
DML语言所有的操作都是显示事务;隐式事务
数据库自动提交,同时不具备回滚性;
DDL、DCL语言都是隐式事务操作
关于DQL、DML、DDL、DCL的区别
可看我之前的文章总结
数据库之DQL、DML、DDL、DCL详细分析
6. 实战
提交事务主要是有改变数据
也就是增删改
public class TestMyBatis {//测试方法,测试功能@Testpublic void testInsert() throws IOException {//访问mybatis读取student数据//1.定义mybatis主配置文件的名称, 从类路径的根开始(target/clasess)String config="mybatis.xml";//2.读取这个config表示的文件InputStream in = Resources.getResourceAsStream(config);//3.创建了SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//4.创建SqlSessionFactory对象SqlSessionFactory factory = builder.build(in);//5.获取SqlSession对象,从SqlSessionFactory中获取SqlSessionSqlSession sqlSession = factory.openSession();//SqlSession sqlSession = factory.openSession(true);//6.【重要】指定要执行的sql语句的标识。 sql映射文件中的namespace + "." + 标签的id值String sqlId = "com.bjpowernode.dao.StudentDao.insertStudent";//7. 重要】执行sql语句,通过sqlId找到语句Student student = new Student();student.setId(1006);student.setName("关羽");student.setEmail("guanyu@163.com");student.setAge(20);int nums = sqlSession.insert(sqlId,student);//mybatis默认不是自动提交事务的, 所以在insert ,update ,delete后要手工提交事务sqlSession.commit();//8.输出结果System.out.println("执行insert的结果="+nums);//9.关闭SqlSession对象sqlSession.close();}
}
编译完成之后,需要提交事务才可看到新增加的数据,mybatis默认是没有提交事务
即在insert ,update ,delete后要手工提交事务
//mybatis默认不是自动提交事务的, 所以在insert ,update ,delete后要手工提交事务sqlSession.commit();
数据库关于事务的详解分析(全)包含面试常问的细节相关推荐
- 数据库SQL实战题目详解(全61题)---(41-61)部分
题目来源:牛客网–<数据库SQL实战> https://www.nowcoder.com/ta/sql?page=0 题目答案为博主自写已通过运行,题目难度近似于阶梯上升,可根据自身情况分 ...
- hashmap为什么用红黑树_全网最全,面试常问的HashMap知识点
引言 其实我很早以前就想写一篇关于HashMap的面试专题.对于JAVA求职者来说,HashMap可谓是集合类的重中之重,甚至你在复习的时候,其他集合类都不用看,专攻HashMap即可. 然而,鉴于网 ...
- mysql讲事物写到数据库_CookBook/1-MySQL数据库读写锁示例详解、事务隔离级别示例详解.md at master · Byron4j/CookBook · GitHub...
MySQL数据库读写锁示例详解.事务隔离级别示例详解 锁 性能分:乐观(比如使用version字段比对,无需等待).悲观(需要等待其他事务) 乐观锁,如它的名字那样,总是认为别人不会去修改,只有在提交 ...
- Spring事务管理详解_基本原理_事务管理方式
Spring事务管理详解_基本原理_事务管理方式 1. 事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象 ...
- 详解分析MySQL8.0的内存消耗
文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 目录 1.innodb_ ...
- c语言菜单选择如何用字符形式,【创客天地】计算机二级C语言、VB考试详解分析...
原标题:[创客天地]计算机二级C语言.VB考试详解分析 01 马上就要迎来计算机二级考试了,你准备好了吗?今天助手君准备了一点C语言干货,希望对即将考试的你有所帮助.(上期刚刚推了office,有需要 ...
- 关于事务管理的理解和Spring事务管理详解
转载于:http://www.mamicode.com/info-detail-1248286.html 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000 ...
- linux oracle 用户创建,LINUX下Oracle数据库用户创建方法详解
本文实例分析了LINUX下Oracle数据库用户创建方法.分享给大家供大家参考,具体如下: 1)登录linux,以oracle用户登录(如果是root用户登录的,登录后用 su - oracle命令切 ...
- 26.SpringBoot事务注解详解
转自:https://www.cnblogs.com/kesimin/p/9546225.html @Transactional spring 事务注解 1.简单开启事务管理 @EnableTrans ...
最新文章
- Discuz!NT 在线用户功能简介
- Linux sed Examples--转载
- es ik分词热更新MySQL,ElasticSearch(25)- 改IK分词器源码来基于mysql热更新词库
- 计算机的前端总线又称为,《计算机组成原理》复习资料
- npm dev run 报错
- 对小程序框架WePY的精简总结
- 线程同步 -事件Event、临界区对象CriticalSection
- pytorch自我错误总结
- 推贴B2B/B2C订货商城系统 V3.0版
- 2022年基于PXI/PCI/PCIe/USB总线的高速数据采集卡汇总
- 动态电路中的动态元件——电容和电感
- 项目总结Word基本格式
- 【渝粤教育】电大中专跨境电子商务理论与实务 (5)作业 题库
- 传奇开服怎么开服?不会技术自己能开服吗?传奇开服需要准备什么?前期需要投入多少?
- Win10 Win11 安装和使用手记
- JS中数组的常用方法(concat拼接,join修改间隔符,pop移除最后一个元素,push在数组最后添加新的元素,reverse反转数组元素,shift移除第一个元素,unshift添加,spli)
- 哨兵2A数据的下载与处理
- 计算机的应用技术包括CAE,CAE技术
- 静态重定位和动态重定位
- android服务无法启动,Android应用程序无法启动服务