数据库事务

SQL中的事务ACID

坚强是说给别人听的谎言 提交于 2020-01-07 18:24:52
概述: 事务是由一系列语句构成的逻辑工作单元。事务和存储过程等批处理有一定程度上的相似之处, 通常都是为了完成一定业务逻辑而将一条或者多条语句“封装”起来,使它们与其他语句之间出现一个逻辑上的边界,并形成相对独立的一个工作单元。 当使用事务修改多个数据表时,如果在处理的过程中出现了某种错误,例如系统死机或突然断电等情况,则返回结果是数据全部没有被保存。 因为事务处理的结果只有两种:一种是在事务处理的过程中,如果发生了某种错误则整个事务全部回滚,使所有对数据的修改全部撤销,事务对数据库的操作是单步执行的,当遇到错误时可以随时回滚; 另一种是如果没有发生任何错误且每一步的执行都成功,则整个事务全部被提交。从而可以看出,有效地使用事务不但可以提高数据的安全性,还可以增强数据的处理效率。 MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。 事务用来管理 insert,update,delete 语句 事务包含四种重要的属性,被统称为ACID

Oracle数据库名词解释

有些话、适合烂在心里 提交于 2020-01-07 17:56:49
数据:描述事物的符号记录。 数据库:长期存储在计算机内、有组织的、可共享的统一管理的数据集合。 数据库系统:带有数据库的计算机应用系统,因此不仅包括数据库本身,即实际存储在计算机中的数据,还包括相应的硬件支撑环境、软件系统和各类相关人员。也就是说,数据库系统是一个由使用和维护人员、软硬件和数据资源等构成的完整计算机应用系统。 数据库管理系统:是位于用户与操作系统之间的具有数据定义、数据操纵、数据库的运行管理、数据库的建立和维护功能的一层数据管理软件。 外模式:用户模式,是数据库用户和数据库系统的接口,是数据库用户的数据视图,是数据库用户可以看见和使用的局部数据的逻辑结构和特征的描述,是与某一应用有关的数据的逻辑表示。外模式是保证数据库安全的重要措施。每个用户只能看见和访问所对应的外模式中的数据,而数据库中的其他数据均不可见。 模式:又可细分为概念模式和逻辑模式,是所有数据库用户的公共数据视图,是数据库中全部数据的逻辑结构和特征的描述。 内模式:又称为存储模式,是数据库物理结构和存储方式的描述,是数据在数据库内部的表示方式。 外模式/模式映像:对于每一个外模式,数据库系统都一个外模式/模式映像,它定义了该外模式与模式之间的对应关系。如果数据库的模式改变,则对外模式/模式映像作相应改变,使外模式保持不变,从而不必修改外模式的应用程序,保证了数据与程序的逻辑独立性。 模式/内模式映像

Spring知识点小结

≯℡__Kan透↙ 提交于 2020-01-07 13:52:00
1.Spring是什么? Spring是一个轻量级的IoC和AOP容器框架。目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。 主要由以下几个模块组成: Spring Core:核心类库,提供IOC服务; Spring AOP:AOP服务; Spring Context:提供框架式的Bean访问方式; Spring DAO:对JDBC的抽象,简化了数据访问异常的处理; Spring ORM:对现有的ORM框架的支持; Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传; Spring MVC:提供面向Web应用的Model-View-Controller实现。 2、Spring 的优点? spring属于低侵入式设计,代码的污染极低; spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性; Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。 spring对于主流的应用框架提供了集成支持。 3.Spring的AOP理解: AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”

数据库并发事务存在的三个问题(脏读、不可重复读、幻读)

孤街醉人 提交于 2020-01-07 13:20:06
如果不考虑事务隔离性,可能会发生以下情况 脏读: 事务a,读到了事务b未提交的数据,如果事务a读到了事务b的一些中间数据,待处理的数据。b事务数据还没有提交,就被a事务访问了 (解决方法:将 读未提交 级别提高到 读已提交 例如:orale在事务a 更新t表的时候,表t为锁住的状态,事务a未提交之前,事务b就不能访问t表) 不可重复读: 指的是事务两次读取数据不一样。因为中间被其他事务修改了。解决方法就是 将 级别提高到 可重复。使用行级锁,锁定当前记录,其它事务无法更改。针对update操作 幻读: 一个事务在查询,另一个事务在做插入或者删除,此时就会出现幻读。导致表的总行数不一致的情况 事务的干扰级别:读未提交、读已提交、可重复读、串行化。 隔离级别越高,性能越低 参考博客: https://blog.csdn.net/fanzhigang0/article/details/93198059 来源: https://www.cnblogs.com/jkwll/p/12149661.html

事务失效为哪般?

这一生的挚爱 提交于 2020-01-07 11:53:37
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 最近生产环境发现一个很奇怪的问题,之前用的好好的Spring事务配置在一个接口上突然失效了,其余接口正常。原因究竟是什么呢?且听我慢慢道来。:-) 问题描述: 注:问题的描述是在demo工程中对原问题的模拟,只是为了说明问题,所以数据看起来有点随意,请勿见怪。 数据库表userinfo中有两条数据 配置Sping事务并对两条记录进行同时删除,此时由于两条delete中间有一个异常抛出,所以两条记录不会被删除,一切到这还是非常合乎常理的。 走读问题代码发现工程中有一个类实现了BeanFactoryPostProcessor接口,并且在postProcessBeanFactory方法中对上面调用的接口调用了getBeansOfType,于是在demo中进行模拟,类似于下面这样: 此时,我们在demo工程配置MyBeanFactoryPostProcessor对应的bean,重新调用接口中的delete方法,从结果可以看出,方法中的两个delete操作已经不在同一事务中了,也就是说Spring事务失效了! 问题分析: MyBeanFactoryPostProcessor的bean存在前,可以看到对应的事务配置生效,并生成了代理类。 而配置MyBeanFactoryPostProcessor之后,没有事务的代理类生成了

MySQL索引与事务详解

落花浮王杯 提交于 2020-01-07 11:32:21
MySQL索引与事务详解 一、前言 ​ 上一章我们讲解了MySQL的手工编译安装流程以及相关的数据库操作命令(sql语句),本文将要详细介绍MySQL索引与事务的概念及原理,并初步了解MySQL数据库视图概念,简述数据库的存储过程。 二、索引 2.1索引的概念——什么是索引? ​ 一般来说,一篇论文,或者说一本书,都有其目录,而目录一般是所有章节的概述,或者说是要点核心,而索引的概念其实也与之类似。 ​ 索引,顾名思义,就是一个方便用户搜索所需资源的引导,只不过在数据库中,索引一般被认为是一种特殊的文件,尤其在Linux系统中("一切皆文件")。从专业术语上解释其含义就是“代表记录的引用指针”。 2.2索引的作用 加快查询速度,提高工作效率; 降低i/o成本,提供基础排序; 加快多表之间的连接; 支持唯一性索引(下面会介绍什么是唯一性索引),保证数据表中数据的唯一性性; 2.3索引的分类 2.3.1普通索引 ​ 就是一般的索引,只是为了区别于其他特殊索引的一个统称 2.3.2唯一性索引 ​ 与普通索引基本类同,区别在于,唯一性索引的列中的所有值都不相同,即“唯一”。 ​ 简单举例来说,学生数据表,年龄可以是普通索引,但不可以是唯一性索引,但是详细住址可以是。 2.3.3主键索引 ​ 本质上也是一种唯一性索引,但必须指定为“primary key”,该索引要求主键中的每个值都唯一

nodejs mysql 事务封装

拟墨画扇 提交于 2020-01-07 08:51:22
mysql.js const mysql = require("mysql2"); class MysqlModel { constructor() { this.mysqlConfig = config.mysql; } /** * 实例化mysql */ mysqlInstance() { const poolCluster = mysql.createPoolCluster({ removeNodeErrorCount: 1, // Remove the node immediately when connection fails. defaultSelector: "RR" //RR,RANDOM,ORDER }); const mysqlNodes = this.mysqlConfig; for (let node in mysqlNodes) { poolCluster.add(`${node}`, mysqlNodes[`${node}`]); } return new Promise((resolve, reject) => { poolCluster.getConnection(function (err, connection) { if (err) { reject(err); } else { resolve([ connection,

MySQL MVCC Undo log Redo log

我的未来我决定 提交于 2020-01-07 08:38:47
目录 什么是MVCC? MVCC-插入 MVCC-删除 MVCC-修改 MVCC-查询 Undo log Redo log 什么是MVCC? Multi Version Concurrency Control (多版本并发控制) 并发访问(读或写)数据库时,对事务内正在处理的数据做多版本管理。以实现写操作堵塞的同时,依然可以进行读操作。 MVCC-插入 插入规则:在数据行版本号列保存当前事务ID。 MVCC-删除 删除规则:将删除版本号列更新为当前事务ID。 MVCC-修改 修改规则:现将命中的数据行copy,将原数据的删除版本号设置为当前事务ID(33)。 MVCC-查询 查询规则: 1. 查找数据行版本小于或等于当前事务版本的数据行。这样可以确保事务读取的行,要么是在事务开始之前就存在的,要么是事务自身插入或修改过的; 2. 查找删除版本号要么为NULL,要么大于当前事务版本号的数据行。这样可以确保查询出来的记录在事务开启前没有被删除。 Undo log Undo意为取消,以撤销操作为目的,返回指定某个状态的操作。 Undo log指事务开始之前,在操作任何数据之前,首先将需操作的数据备份到一个地方 (Undo Log)。 UndoLog是为了实现事务的原子性而出现的产物。 Undo Log实现了事务的原子性: 事务处理过程中如果出现了错误或者用户执行了 ROLLBACK语句

MySQL中的共享锁与排他锁

不羁岁月 提交于 2020-01-07 07:59:35
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在 MySQL中的行级锁,表级锁,页级锁 中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突。行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念、使用方式及注意事项等。 共享锁(Share Lock) 共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。 用法 SELECT ... LOCK IN SHARE MODE; 在查询语句后面增加 LOCK IN SHARE MODE ,Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。 排他锁(eXclusive Lock) 排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。 用法 SELECT ... FOR UPDATE; 在查询语句后面增加 FOR UPDATE

MySQL中的共享锁与排他锁

爱⌒轻易说出口 提交于 2020-01-07 07:32:32
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在 MySQL中的行级锁,表级锁,页级锁 中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突。行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念、使用方式及注意事项等。 共享锁(Share Lock) 共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。 用法 SELECT ... LOCK IN SHARE MODE; 在查询语句后面增加 LOCK IN SHARE MODE ,Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。 排他锁(eXclusive Lock) 排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。 用法 SELECT ... FOR UPDATE; 在查询语句后面增加 FOR UPDATE