事务隔离级别

高性能MySQL之锁详解

╄→尐↘猪︶ㄣ 提交于 2020-03-07 23:03:02
一、背景 MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。数据库锁的设计的初衷是处理并发问题。我们知道多用户共享资源的时候,就有可能会出现并发访问的时候,数据库就需要合理的控制资源的访问规则,因此,锁就应运而生了,它主要用来实现这些访问规则的重要数据结构。 二、全局锁 顾名思义,全局锁就是对整个数据库实例加锁,可以通过命令 Flush tables with read lock (FTWRL)对整个数据库实例子加锁。让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。 全局锁有一个经典的使用场景就是做全库逻辑备份,也就是说吧整个数据库的每个表都用select 出来存成文本。以前有一种做法是通过FTWRL确保不会有其他线程对数据库做更新,然后对整个库做备份。注意,在备份过程中整个库完全处于只读状态。 你此时是不是觉得很危险? 如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆; 如果你在从库上备份,那么备份期间从库不能执行主库同步过来的binlog,会导致主从延迟。 看上去确实很危险,但是我们细想一下,备份为什么要加锁呢?如果我们不加锁又会出现什么问题呢? 假设你现在要维护京东的购买系统,关注的是用户账户余额表和用户商品表。

redis事务

我与影子孤独终老i 提交于 2020-03-05 23:36:27
redis事务命令 MULTI 开启事务的标识 DISCARD 主动放弃 EXEC 执行事务(EXEC命令执行后所有的监视锁都会自动取消) WATCH 监视一个或多个key,监视的key在EXEC提交时会检测key的值是否发生了改变,如果改变了就会导致事务失败,返回Nullmulti-bulk以通知调用者事务失败。类似于乐观锁。 UNWATCH 取消对所有key的监视 4种结果 全体连坐(输入命令时就报错,比如redis的命令错误、参数个数错误、cmd下直接会出错误信息,会导致本次事务失败) 冤头债主(QUEUED成功,事务EXEC后 失败的失败,成功的成功,互不影响) 正常执行 放弃事务 小结 redis部分支持事务,不像ORCALE和MYSQL一样强硬要求。 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行,事务在执行过程中,不会被其他客户端所发来的命令打断。 没有隔离级别的概念:队列中的命令在没有提交之前都不会被实际的执行,因为事务提交前任何操作都不会被执行。 不保证原子性:redis同一个事务如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。 来源: https://www.cnblogs.com/Ghostant/p/12423678.html

Spring事务管理-@Transactional注解详解

瘦欲@ 提交于 2020-03-05 15:02:37
一、概念 首先事务 是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。事务有 Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)四种特性,简称ACID四特性。 原子性 事务最基本的操作单元,要么全部成功,要么全部失败,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。 一致性 事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。 隔离性 指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。 持久性 指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。 二、Transactional注解原理 spring 在扫描bean的时候会扫描方法上是否包含

[Java面试十二]数据库概念相关

南楼画角 提交于 2020-03-05 12:54:02
1. 什么是存储过程?它有什么优点? 答:存储过程是一组予编译的 SQL 语句, 它的优点有: 允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。 允许更快执行,如果某操作需要执行大量 SQL 语句或重复执行,存储过程比 SQL 语句执行的要快。 减少网络流量,例如一个需要数百行的 SQL 代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。 更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。 2. oracle的 存储过程和函数有什么区别? Oracle 中的函数与存储过程的 区别 : A: 函数必须有返回值 , 而过程没有 . B: 函数可以单独执行 . 而过程必须通过 execute 执行 . C: 函数可以嵌入到 SQL 语句中执行 . 而过程不行 . 其实我们可以将比较复杂的查询写成函数 . 然后到存储过程中去调用这些函数 . Oracle 中的函数与存储过程的 特点 : A. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。 B. 对于存储过程来说可以返回参数,而函数只能返回值或者表对象。 C. 存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于 FROM 关键字的后面。 3. 什么是事务? 答

Spring面试笔记

时光总嘲笑我的痴心妄想 提交于 2020-03-05 12:04:54
1. Spring工作机制及为什么要用? Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。Spring既是一个AOP框架,也是一IOC容器。 SpringFramework的组成:Spring AOP,Spring DAO,Spring ORM,Spring Web,Spring Context, Spring Web MVC。 Spring的核心就是IOC和AOP,所以Spring的工作机制简单的理解也就是IOC和AOP的工作机制。 借助于Spring AOP,Spring IoC能够很方便的使用到非常健壮、灵活的企业级服务,通过使用IoC能够降低组件之间的耦合度,最终,能够提高类的重用性,利于测试,而且更利于整个产品或系统集成和配置。 2. 说说AOP和IOC的概念以及在spring中是如何应用的? AOP,Aspect Oriented Program,面向(方面)切面的编程; IOC,Invert Of Control,控制反转。 简单说一下,IOC就是其实就是依赖注入,即用接口编程,在程序中不出现new关键字,而是用接口来命名引用,然后通过某种方式把接口的某个实现类的实例注入到引用里,从而实现接口与具体实现类的松耦合。 由容器控制程序之间的关系(通过XML配置),而非传统实现中的由程序代码直接操控,(在一个Class对象中引用另一个Class对象时

MySQL之架构与历史(二)

大憨熊 提交于 2020-03-03 23:08:15
多版本并发控制 MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。不仅是MySQL,包括Oracle、PostgreSQL等其他数据库系统也都实现了MVCC,但各自的实现机制不尽相同,因为MVCC没有一个统一的实习标准。 可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制不同,但大都实现了非阻塞的读操作,写操作也只锁定了必要的行。 MVCC的实现,是通过保存数据在某个时间点的快照来实现的。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。 前面说到不同存储引擎的MVCC实现是不同的,典型的有乐观(optimistic)并发控制和悲观(pessimistic)并发控制。下面我们通过InnoDB的简化版行为来说明MVCC是如何工作的。 InnoDB的MVVC,是通过在每行记录后面保存两个隐藏列来实现的。一个保存了行的创建时间,一个保存了行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(system version number)。每开启一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为当前事务的版本号

MySQL 事务及事务的隔离级别

回眸只為那壹抹淺笑 提交于 2020-03-03 20:01:07
什么是事务 通过一组逻辑操作单元(一组DML——sql语句),将数据从一种状态切换到另外一种状态。 事务的特点(遵循ACID原则) 原子性(atomicity) :最小的执行单元。(要么全成功,有一条失败则回滚到最初状态)要么都执行,要么都回滚 一致性(consistrncy) :保证数据的状态操作前和操作后保持一致,即事务的执行使得数据库从一种正确状态转换为另一种正确的状态。 隔离性(isolation) :多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰 持久性(durability) :一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改 事务的作用 : 事务管理对于企业级应用而言至关重要,它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性。就像银行的自动提款机ATM,通常ATM都可以正常为客户服务,但是也难免遇到操作过程中及其突然出故障的情况,此时,事务就必须确保出故障前对账户的操作不生效,就像用户刚才完全没有使用过ATM机一样,以保证用户和银行的利益都不受损失。 相关步骤: 1、开启事务 2、编写事务的一组逻辑操作单元(多条sql语句) 3、提交事务或回滚事务 事务控制语句 : begin/ start transaction:开启事务 commit:提交事务 rollback:回滚事务

spring 事务隔离级别配置

こ雲淡風輕ζ 提交于 2020-03-03 05:29:38
声明式的事务处理中,要配置一个切面,即一组方法,如 Java代码 <!-- 声明式事务管理 --> <!-- 隔离级别配置--> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="query*" propagation="SUPPORTS" read-only="true" /> <tx:method name="list*" propagation="SUPPORTS" read-only="true" /> <tx:method name="create*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="modify*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="delete*" propagation=

SpringAOP声明式事务控制:xml配置(spring提供的事务管理器)

痞子三分冷 提交于 2020-03-03 04:00:29
文章目录 1. 创建 spring 的配置文件并导入约束 2. 编写业务层,持久层 3. 在配置文件中配置业务层和持久层对 4. spring中基于XML的声明式事务控制配置步骤 1. 创建 spring 的配置文件并导入约束 此处需要导入 aop 和 tx 两个名称空间 < ? xml version = "1.0" encoding = "UTF-8" ? > < beans xmlns = "http://www.springframework.org/schema/beans" xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns : aop = "http://www.springframework.org/schema/aop" xmlns : tx = "http://www.springframework.org/schema/tx" xsi : schemaLocation = "http : / / www . springframework . org / schema / beans http : / / www . springframework . org / schema / beans / spring - beans . xsd http : / / www .

事务特性及隔离级别

喜你入骨 提交于 2020-03-03 00:16:26
一、事务特性 1. 原子性 事务的原子性即需保证事务是一个原子操作,要么全部成功一起提交,要么全部失败一起回滚,一个事务不可能之完成其中的一部分 2. 一致性 事务的一致性,即数据库总是从一个一致性状态转换到另一个一致性状态,即不论发生异常或者是机器故障等,事务若没有最终提交,事务中所已经执行语句也不会对数据库产生影响 3. 隔离性 一个事务提交成功之前所作的操作,对其他事务是不可见的 4. 持久性 一旦事务成功提交,其对数据库数据所做的修改就会永久保存到数据库中 二、隔离级别 1. 未提交读(READ UNCOMMITTED) 事务中所执行的操作,即使未提交,也对其他事务可见(事务可以读取其他事务未提交的事件,成为脏读) 2. 提交读(READ COMMITTED) 一个事务中,看不到其他事务未提交前的所做的修改,但其他事务一旦提交,本事务中就会对其修改可见。因此,当你在一个事务中执行相同的查询操作,可能会得到不同的查询结果(中间有修改所查数据的事务提交成功),称为不可重复读 3. 可重复读(REPEATABLE READ) 可重复读是mysql中默认的隔离级别,决解了脏读的问题,该级别保证一个事务中多次相同查询的结果不变。但又产生了新的问题“幻读”,即其他事务在本事务查询范围内又重新插入数据,此时就会产生幻读,即查询结果会多出新插入数据。Innodb通过mvcc决解了这个问题