事务隔离级别

spring 学习笔记

旧巷老猫 提交于 2019-12-16 21:57:25
闲话 最近简单的学习了一下 springboot,记录下自己的一些学习心得,没有体系,没有深入讲解,基本只涉及到一些概念级,权当随笔记录。。他日翻看时,希望能有所帮助,肯定也有理解不到位之处,还请大家指正 为什么会有 spring 学习一项技术,我们首先需要弄明白,这项技术出现的意义是什么,它能够解决什么场景问题,知其然,必先知其所以然 一般大型的企业级java应用,都会包含很多的内容模块,包括各种接口、逻辑、页面、存储等,它们之间可能存在复杂的依赖关系,如何对他们进行统一的管理和调度是影响开发效率的重要因素 容器化管理我们的应用程序,是上述问题的通用解决方案:应用的开发针对 pojo、bean或者组件,然后交由容器去负责组装调用,实现解耦 在spring之前,java官方推荐的解决方案是 EJB,但是 EJB 是一个非常重型的框架,上手成本很高,对于中小型的企业应用支持并友好 于是民间组织在 EJB 的容器化管理的基础上,创建了 spring,相对来说更轻量级的开发框架,简单对比 EJB 的话,他俩的优缺点: EJB 面向的是组件级容器管理,spring 则是 bean 的管理,更细粒度,对于开发的理解更容易 EJB 和 spring 都支持 ioc 和 aop,但是 spring 封装的功能更强大简单,早期spring只支持xml配置方式,ejb只支持注解方式,随着发展

事务和锁学习

自闭症网瘾萝莉.ら 提交于 2019-12-16 19:43:37
   为什么要使用事务?   一个经典的例子就是银行转账问题。当把钱从一个银行转到另一个银行的时候,这操作由两步完成,首先要把钱从一个银行提取出来,然后再将钱存入另一个银行。如果此时,钱已经从一个银行提取出了,但将钱存入另一个银行的过程中或之前发生异常情况,如果没有事务保护就会出现源账号中钱减少,但目标账号中的钱并没有增加的情况。   事务简介:从严格意义上讲,事务是形成一个逻辑工作单位的数据库操作的汇集。通俗的讲,事务是能以原子操作形式完成的一系列操作。   事务四个基本特性:     原子性:一个事务中所有数据库操作是一个不可分割的整体,这些操作要么全部执行,要么全部无效。     一致性: 在事务处理执行之前和之后,数据是一致的。     隔离性:一个事务对另一个事务没有影响。     持久性:一个事务一旦完成全部操作后,它对数据库操作将永久反映在数据库中。    为什么要引入锁?   多个用户同时对数据库操作会带来数据不一致的问题。   并发的副作用:     丢失更新:两个用户或多个用户同时修改数据库,其中一个用户修改破坏了另一个用户的修改结果。     脏读: 一个用户进程读取了另一个用户进程修改过但没有正式提交的数据,这时导致了数据不一样的情形发生了。     不可重复读:一个用户读取数据,另一用户读取该数据并修改,此时前一个用户在读取发现前后两次数据不一致。    

SQL SERVER 事务处理

别来无恙 提交于 2019-12-16 18:24:17
<1>.事务的概念 事务是一个不可分割的工作逻辑单元。 <2>.为什么使用事物 可以防止错误的发生。 <3>.事物的作用 要么所有的操作全部完成,要么所有操作都不执行。 <4>.什么是事物 事务是单个的工作单元 如果某一事务成功,则在该事务中进行的所有的数据更改均会提交,称为数据库中的永久组成部分。 如果事务遇到错误且必须取消或回滚,则所有数据更改均被清楚。 <5>.事务的特性 事务必须具备以下四个属性,简称ACID 属性: (1). 原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行。 (2). 一致性(Consistency):当事务完成时,数据必须处于一致状态。 (3). 隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。 (4). 永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性。 <6>.如何创建事务 1. T-SQL使用下列语句来管理事务: (1). 开始事务:BEGIN TRANSACTION (2). 提交事务:COMMIT TRANSACTION (3). 回滚(撤销)事务:ROLLBACK TRANSACTION 2. 一旦事务提交或回滚,则事务结束。 (1).

数据库之锁详解

一曲冷凌霜 提交于 2019-12-16 14:14:12
一、概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外。MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样,为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。 1.表级锁定(table-level) 表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。 当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并发度大打折扣。 使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。 2.行级锁定(row-level) 行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小

事务

怎甘沉沦 提交于 2019-12-16 13:47:38
事务 简单来说,事务就是操作一系列事件,要么全部完成,要么全部不完成。典型例子为银行转账 Innodb 才支持事务,默认REPEATABLE-READ,一般不需要修改 特性 原子性:一系列事件,要么全部完成,要么全部不完成 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable) 格式 账号1 转 账号2 人民币50元 public static void main(String[] args) throws SQLException { String url = "jdbc:mysql://localhost:3306/test"; String username = "root"; String password = ""; Connection conn = (Connection) DriverManager.getConnection(url, username,password)

【转】事务隔离级别——READ-COMMITTED(读已提交)

百般思念 提交于 2019-12-16 13:00:11
原文链接:https://blog.csdn.net/Zzze0101/article/details/91344710 首先,我们先设置MySQL事务隔离级别为Read committed 在my.ini配置文件最后加上如下配置 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. [mysqld] transaction-isolation = READ-COMMITTED 重启MySQL服务 1、脏读 提出问题 同一个应用程序中的多个事务或不同应用程序中的多个事务在同一个数据集上并发执行时, 可能会出现许多意外的问题。 例如: 已知有两个事务A和B, B读取了已经被A更新但还没有被提交的数据,之后,A回滚事务,B读取的数据就是脏数据。 场景: Tom的账户money=0,公司发工资把5000元打到Tom的账户上,Tom的money=money+5000元,但是该事务并未提交,而Tom正好去查看账户,发现工资已经到账,账户money=5000元,非常高兴,可是不幸的是,公司发现发给Tom的工资金额不对,应该是2000元,于是迅速回滚了事务,修改金额后,将事务提交,Tom再次查看账户时发现账户money=2000元,Tom空欢喜一场,从此郁郁寡欢,走上了不归路……

redis事物详解

被刻印的时光 ゝ 提交于 2019-12-16 10:15:44
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Redis中的事务就是一组命令的集合,被依次顺序的执行,当然你可以放弃事务的执 行,那么所有事务里面的命令都不会执行。 关于Redis的事务有几点说明: 1:Redis的事务仅仅是保证事务里的操作会被连续独占的执行,因为是单线程架构,在执行完 事务内所有指令前是不可能再去同时执行其他客户端的请求的 2:Redis的事务没有隔离级别的概念,因为事务提交前任何指令都不会被实际执行,也就不存 在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题了 3:Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开 始执行全部指令的能力,没有执行到一半进行回滚的能力 Redis事务的基本过程 1:发送一个事务的命令给Redis,命令是multi 2:依次发送要执行的命令给Redis,Redis接到这些命令,并不会立即执行,而是放到等待执 行的事务队列里面 3:发送执行事务的命令给Redis,命令是exec 4:Redis会保证一个事务内的命令依次执行,而不会被其它命令插入 事务过程中的错误处理 1:如果任何一个命令语法有错,Redis会直接返回错误,所有的命令都不会执行 2:如果某个命令执行错误,那么其它的命令仍然会正常执行,然后在执行后返回错误信息 3

深入理解MDL元数据锁

爷,独闯天下 提交于 2019-12-16 09:54:12
前言: 当你在MySQL中执行一条SQL时,语句并没有在你预期的时间内执行完成,这时候我们通常会登陆到MySQL数据库上查看是不是出了什么问题,通常会使用的一个命令就是 show processlist,看看有哪些session,这些session在做什么事情。当你看到 waiting for table metadata lock 时,那就是遇到MDL元数据锁了。本篇文章将会介绍MDL锁的产生与排查过程。 1.什么是MDL锁 MDL全称为metadata lock,即元数据锁。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务(显式或隐式)的时候,不可以对元数据进行写入操作。因此从MySQL5.5版本开始引入了MDL锁,来保护表的元数据信息,用于解决或者保证DDL操作与DML操作之间的一致性。 对于引入MDL,其主要解决了2个问题,一个是事务隔离问题,比如在可重复隔离级别下,会话A在2次查询期间,会话B对表结构做了修改,两次查询结果就会不一致,无法满足可重复读的要求;另外一个是数据复制的问题,比如会话A执行了多条更新语句期间,另外一个会话B做了表结构变更并且先提交,就会导致slave在重做时,先重做alter,再重做update时就会出现复制错误的现象。 元数据锁是server层的锁,表级锁,每执行一条DML、DDL语句时都会申请MDL锁,DML操作需要MDL读锁

面试笔录--spring事务注解--@Transactional

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-16 07:07:11
1. 事物传播行为介绍:   @Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)   @Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不为这个方法开启事务   @Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务   @Transactional(propagation=Propagation.MANDATORY) :必须在一个已有的事务中执行,否则抛出异常   @Transactional(propagation=Propagation.NEVER) :必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)   @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务. 2. 事物超时设置:    @Transactional(timeout=30) //默认是30秒 3.

mysql的mvcc 和next-lock

て烟熏妆下的殇ゞ 提交于 2019-12-16 04:24:09
mysql在rr隔离级别下,是如何解决幻读的? mysql通过mvcc 及加上next-key lock来解决幻读发生的。 很多资料写的是rr隔离级别下是无法避免幻读的,的确是,理论上的rr是无法避免幻读的,但是mysql的innodb引擎通过next-key解决了幻读问题 (select 可以使用for update /lock in share mode来解决幻读)。 mvcc原理 数据行有另外两列,一个是create-version,delete-version,数据创建的时候初始化create-version,被delete及update时,设置其delete-version,值都是当前事务ID 比如我插入一条记录, 事务id 假设是1 ,那么记录如下:也就是说,创建版本号就是事务版本号。 如果我更新的话,事务id假设是2 如果我删除的话,假设事务是id=3 要注意,必须是commit的时候才会修改create-version delete-version字段,在没有提交的情况是,是不会修改和创建的。 这样保证了在 a b 两个事务情况下,假设 a(transationid=1) b(transactionid=2) 由于事务a早于事务b 约束: 1.事务只能读取到delete-version为空,或者delete版本号小于当前事务的数据行 2.事务只能读取到create