mysql事务

数据库-事务隔离级别

馋奶兔 提交于 2019-11-26 19:29:02
READ-UNCOMMITED(读未提交) 事务A能读到事务B未提交的数据,也就有了脏读,这个事务隔离级别会发生 脏读、不可重复读、幻读 。 READ-COMMITED(读已提交) 事务只能看到已经提交的数据,事务再提交前的操作对其他事务是不可见的。 这个级别可能会出现 不可重复读 ,事务A先读到了c,但是在事务A提交前,事务B修改了c并且提交了,事务A再读就和原来的不一样了,重复读的结果不一样,还可能出现 幻读 。 REPEATABLE READ(可重复读) 同一事务中多次读取同样的记录的结果是一样的,这个MySQL默认的隔离级别。 可能出现 幻读 ,比如事务A读取了某个范围内的记录,事务B再这个范围内插入了新的记录,那么A再次读取的时候就出现了幻行。 在MySQL的InnoDB和XtraDB中通过MVCC解决了幻读。 SERIALIZABEL(可串行化) 强制事务串行执行,避免了前面所有的问题,可能会导致大量超时和锁竞争的问题。 MVCC(多版本并发控制) InnoDB是通过每行后面保存 两个隐藏的列 来实现的,分别保存 行的创建时间和过期时间 ,保存时时系统版本号,没开始一个新的事务都会递增这个版本号。 在可重复读下的MVCC: SELECT: 1)InnoDB只查找早于当前事务版本的数据行,也就是行的系统版本号要小于等于事务的系统版本号

mysql 事务

蓝咒 提交于 2019-11-26 19:20:47
什么是事务 一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元) 为什么需要事务 需求:jeff 给jack 转账1000元 假设转账分为两部完成 1. jeff减少1000 update test set money = money -500 where name= ‘jeff’ 2. jack增加1000 update test set money = money +500 where name= ‘jack’ 如果在完成了第1步的时候突然宕机了,jeff的钱减少了而jack的钱没有增加那jeff岂不是白白丢了1000元;这时候就需要用到我们的事务了 事务流程: 1. begin 开启事务(开启事务后会把所有的操作先存放到事务日志data目录下的ib_logfile0 ,ib_logfile01) 2. 进行实务操作 3. 关闭事务 a. COMMIT提交事务:同步数据保存到数据库表 b. ROLLBACK回滚事务:清空日志表 事务只有两个状态要嘛提交 要嘛回滚。所以提交后的事务无法回滚 commit 事务提交 rollback 事务回滚 begin 开启事务 start transaction 开启事务 同begin set transaction 设置事务隔离级别,只对当前会话有效 事务的特征(ACID) A:原

易出错记录

元气小坏坏 提交于 2019-11-26 18:46:11
1、抽象基类Spring注入问题 特别注意:1、注解注入的属性需要用protected修饰,2、注解注入的属性需要有setter方法; 正确示例: @Autowired protected A a; public void setA(A a) { this .a = a; } 2、spring事务隔离性,隔离级别,mysql默认隔离级别(可重复读)   MYSQL可重复读的隔离级别下使用了MVCC机制,select操作不会更新版本号,是快照读(历史版本)  同一事务下多次读结果一样,因此,并发情况下,两个事务下两个订单状态同时更改,每一个事务并不能读到另一个事务里的另一个订单状态发生变化。 InnoDb在可重复读下,检索条件存在索引的情况下,会自动使用间隙锁,一定程度上防止了幻读。 错误用法:一个事务操作里,更新一个订单的状态的完成后,查询另一个订单的状态,当这个两个订单状态都是目标状态时,将另一个总的父记录状态更新,如两个订单同时更新,则总的父记录不会被更新。 转载于:https://www.cnblogs.com/ccgblog/p/11149618.html 来源: https://blog.csdn.net/weixin_30511107/article/details/99032773

spring事务和jdbc事务

强颜欢笑 提交于 2019-11-26 18:00:33
Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); 执行CRUD 提交事务/回滚事务 con.commit() / con.rollback(); 关闭连接 conn.close(); 使用Spring的事务管理功能后,我们可以不再写步骤 2 和 4 的代码,而是由Spirng 自动完成。那么Spring是如何在我们书写的 CRUD 之前和之后开启事务和关闭事务的呢?解决这个问题,也就可以从整体上理解Spring的事务管理实现原理了。下面简单地介绍下,注解方式为例子 配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识。 spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)。 真正的数据库层的事务提交和回滚是通过binlog或者redo

数据库

风流意气都作罢 提交于 2019-11-26 18:00:07
这几天,要开始面试了,数据库无疑是各家面试的重头之一,在此总结一下数据库的一些知识点。 数据库:   数据库表面上就是一系列的表格,包含的属性主要有: 约束:      主键约束:唯一标志一个数据库   外键约束:用来连接标语表之间的关系   唯一性约束: 索引: 原理(B Tree / B+ Tree)   数据库对一个属进行普通的检索的时候,需要从头到尾进行遍历,直到查到相应的数据,如果数据量巨大的话则相应的开销也是相当大,不利于实际使用,于是索引诞生   对我们需要频繁进行查找的列进行设置索引,则,下次搜索的时候可以直接搜索索引一列,而不需要全盘搜索,又因为BTree的作用,可以将这其中的搜索时间呈指数式减少   比如: 有100000000条某数据,现在要在其中检索出某个数值,最差情况下要检索10000000次,而如果设置索引,根据BTree的深度,可以下降到10(B树的深度即需要检索的次数),甚至更少。   索引优点:可以更快的检索数据   既然索引这么方便,为什么不给每个列设置一个索引,以方便使用,这是因为,索引需要占据实际的物理空间,且每次对相应的列进行增删改的时候,都需要相应的修改索引,因此,在过多的不需要频繁查询的列设置索引只会增加维护的难度,总结:对索引进行查找省时间,索引占空间,维护耗时间。所以需要综合考虑,达到一个最完美的状态,少了达不到效果,多了增加消耗。

深入理解Mysql事务ACID特性以及事务隔离级别

柔情痞子 提交于 2019-11-26 17:50:57
事务的概念: 1.事务是一组sql语句的执行,要么全部成功,要么全部失败。保证事务执行的原子性。 2.事务的全部sql语句执行成功,才能提交,将结果写回到磁盘上。 3.事务执行过程中,有的SQL执行失败,那么事务必须回滚到最初的状态。 事务的ACID特性: 事务的原子性(Automic): 事务是一个不可分割的整体, 事务必须具有原子性 ,当修改数据时,要么全部执行,要么都不执行,即不允许事务部分完成。 事务的一致性(Consistency): 一个事务执行前后, 数据库数据必须保持一致性状态 。数据库的一致性状态必须由用户来负责,由并发控制机制实现。就拿网上购物来说,你只有让商品出库,又让商品进入顾客的购物车才能构成一个完整的事务, 商品的数量对于整体并没有发生变化 !由于并发操作带来的数据不一致性包括读脏数据(脏读),不可重复读和虚读(幻读)。 事务的隔离性(Isolation): 当两个或者多个事务并发执行时,为了保证数据的安全性, 将一个事物内部的操作与其它事务的操作隔离起来,不被其它正在执行的事务所看到 ,例如对任何一对事务T1和T2,对T1而言,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行。 隔离性使得每个事务的更新在它被提交之前,对其它事务都是不可见的 。 事务的持久性(Durability): 事务完成之后,它对数据库数据的修改,是永久性的。

Django 的F查询与Q查询,事物

≯℡__Kan透↙ 提交于 2019-11-26 17:28:20
F查询    Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值    示例1: 查询出卖出数大于库存数的商品 from django.db.models import F ret1=models.Product.objects.filter(maichu__gt=F('kucun')) print(ret1) F可以帮我们取到表中某个字段对应的值来当作我的筛选条件,而不是我认为自定义常量的条件了,实现了动态比较的效果 Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。基于此可以对表中的数值类型进行数学运算 将每个商品的价格提高50块 models.Product.objects.update(price=F('price')+50) 引申: 如果要修改char字段咋办(千万不能用上面对数值类型的操作!!!)? 如:把所有书名后面加上'新款',(这个时候需要对字符串进行拼接Concat操作,并且要加上拼接值Value) from django.db.models.functions import Concat from django.db.models import Value ret3=models.Product.objects.update(name

mysql --limit

安稳与你 提交于 2019-11-26 17:05:28
select * from a order by aid limit 2 offset 3 -- 第一个,2是指一页展示2条数据,第二个,3是指从查询结果中索引为3的那一条数据开始 select * from a order by aid limit 3,2 -- 上面的简写 --想查看第四页的数据(每页数据两个):首先计算索引开始的位置: (4-1)*2 = 6 select * from a order by aid limit 6,2 --一共有七天数据,每页有两个,那么有多少页呢。 7//2 + 1 = 4 页 select * from a,b -- 这种笛卡尔查询。乘积 select * from a inner join b on a.aid = b.bid -- ab两表中同时达到查询条件的记录才会被查出来 select * from a right join b on a.aid = b.bid -- 右连接查询 select * from a left join b on a.aid = b.bid -- 左连接查询 可见,数据库事务具有ACID这4个特性: A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行; C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100

MySQL的事务隔离级别

ぐ巨炮叔叔 提交于 2019-11-26 16:43:24
事务的概念   事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。 事务的四个属性 1、原子性:事务是由一个或一组相互关联的SQL语句组成,这些语句被认为是一个不可分割的单元,要么都成功要么全回滚。 2、一致性:对于数据库的修改是一致的,即多个用户查的的数据是一样的。一致性主要由mysql的日志机制处理,他记录数据的变化,为事务恢复提供跟踪记录。 3、隔离性:每个事务都有自己的空间,和其他发生在系统中的事务隔离开来,而且事务的结果只在他完全被执行时才能看到 4、持久性:但提交了这个事务之后对数据的修改更新就是永久的。当一个事务完成,数据库的日志已经被更新时,持久性即可发挥其特有的 功效,在mysql中,如果系统崩溃或者数据存储介质被破坏,通过日志,系统能够恢复在重启前进行的最后一次成功更新,可以反应系统崩溃时处于执行过程的事物的变化。 事务的隔离级别 1、读未提交(脏读)READ UNCOMMITTED   A事务读取到了B事务未提交的数据,脏读 2、读已提交(不可重复度)READ COMMITTED   A事务读取B事务提交的事务

hibernate1+基础入门

こ雲淡風輕ζ 提交于 2019-11-26 16:17:34
第1章 hibernate 和 ORM 的概念部分 1.1 Hibrenate 概述 Hibernate是一种 Java 语言下的 对象关系映射 解决方案。它是使用 GNU宽通用公共许可证 发行的 自由 、 开源 的软件。它为 面向对象 的 领域模型 到传统的 关系型数据库 的映射,提供了一个使用方便的 持久化框架 。 Hibernate框架是Java持久层框架之一,它的设计目标是将软件开发人员从大量相同的 数据持久层 相关编程工作中解放出来。无论是从设计草案还是从一个 遗留 数据库开始,开发人员都可以采用Hibernate。Hibernate不仅负责从Java 类 到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大地缩短了手动处理 SQL 和 JDBC 上的开发时间,由于它具有简单易学、灵活性强、扩展性强等特点,能够大大地简化程序的代码量,提高工作效率,因此受到广大开发人员的喜爱。 Hibernate是一个开放源代码的ORM框架,它对JDBC进行了轻量级的对象封装,使得Java开发人员可以使用面向对象的编程思想来操作数据库。 1.2 ORM 概述 Object Relation Mapping 对象关系映射。 对象 -关系映射(OBJECT/RELATIONALMAPPING,简称ORM),是随着面向对象的