mysql事务

Spring 事务

我的未来我决定 提交于 2019-11-27 19:23:14
Spring 事务 关于理论性的内容,我在之前的一篇文章中介绍过,这里不再过多阐述,这里给出之前文章的链接: Spring 事务管理 什么是事务 是一组逻辑操作,要么执行,要么不执行。 事务的特性 ACID (原子性、一致性、隔离性、持久性) 并发事务带来的问题 脏读 丢失修改 不可重复读 幻读 配置事务管理器 <!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 数据源 --> <property name="dataSource" ref="dataSource" /> </bean> Spring 事务接口 PlatformTransactionManager :(平台)事务管理器 TransactionDefinition : 事务定义信息(事务隔离级别、传播行为、超时、只读、回滚规则) TransactionStatus : 事务运行状态 1. PlatfromTransactionManager 接口介绍: 该接口主要有三个方法: Public interface PlatformTransactionManager()...{ TransactionStatus

MySQL存储引擎之InnoDB

谁说胖子不能爱 提交于 2019-11-27 18:56:33
MySQL默认存储引擎为InnoDB,可以通过使用命令SHOW VARIABLES LIKE 'storage_engine'; 一、InnoDB存储引擎 1.InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID)  (MyISAM:不支持事务; 只支持表级锁 ) 事务的ACID属性:即原子性、一致性、隔离性、持久性 a.原子性:原子性也就是说这组语句要么全部执行,要么全部不执行,如果事务执行到一半出现错误,数据库就要回滚到事务开始执行的地方。 实现:主要是基于MySQ日志系统的redo和undo机制。事务是一组SQL语句,里面有选择,查询、删除等功能。每条语句执行会有一个节点。例如,删除语句执行后,在事务中有个记录保存下来,这个记录中储存了我们什么时候做了什么事。如果出错了,就会回滚到原来的位置,redo里面已经存储了我做过什么事了,然后逆向执行一遍就可以了。 b.一致性:事务开始前和结束后,数据库的完整性约束没有被破坏。(eg:比如A向B转账,不可能A扣了钱,B却没有收到) c.隔离性:同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰; 如果不考虑隔离性则会出现几个问题: i、脏读:是指在一个事务处理过程里读取了另一个未提交的事务中的数据(当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据

MySQL-第十四篇事务管理

时间秒杀一切 提交于 2019-11-27 18:49:30
1、什么是事务 事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。 2、事务具备的4个特性: 1》原子性(Atomicity):事务是应用中最小的执行单位,事务是应用中不可再分的最小逻辑执行体。 2》一致性(Consistency):事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而该未完成的事务对数据库所做的修改已被写入数据库,此时数据库就处于一种不正确的状态。一致性是通过原子性来保证的。 3》隔离性(Isolation):各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务都是隔离的。 4》持续性(Durability):持续性也称为持久性,指事务一旦提交,对数据所做的任何改变都要记录到永久存储器中,通常就是保存进物理数据库。 3、数据库的事务由下列语句组成: 1》一组DML语句,经过这组DML语句修改后的数据将保持较好的一致性。 2》一条DDL语句 3》一条DCL语句 DDL和DCL语句最多只能是一条,因为DDL和DCL语句都会导致事务立即提交。 4、当事务所包含的全部数据库操作都成功执行后,应该提交(commit)事务,使修改永久生效。事务提交的两种方式: 1》显式提交:使用commit 2

二 Redis的特性

家住魔仙堡 提交于 2019-11-27 17:57:55
Redis 的特性 1.多数据库 1)概念:一个 redis 实例可以包含多个数据库,客户端可以指定连接到某个 redis 实例的的某 个库,就好比 mysql 中创建过个数据库,客户端连接时指定连接哪个库 2)一个 redis 实例最多提供 16 个库,下表从 0 到 15,客户端默认连接 0 号库,也可以通过 select 指定连接哪个库 3)通过 move 命令可以将某个 key 移动到其他的库中 2. 服务器命令 Shutdown 通过客户端关闭服务器 ping 命令测试连接是否存活 echo 命令答应一些内容 quit 退出客户端 dbsize 返回当前数据库中 key 的数目 Info 获取服务器的信息和统计 flushdb 删除当前选择数据库中的所有 key Flushall 删除所有数据库中的所有 key 3 消息订阅和发布(作为消息队列)  subscribe channel:订阅频道,例:subscribe mychat ,订阅 mychat 这个频道  Psubscribe channel*:批量订阅频道,例:psubscribe s*,订阅以 s 开头的频道  Publish channel content: 在指定的频道中发布消息, 如 publish mychart ‘today is a new day’ 实现步骤如下: 1) 订阅某个频道

MySQL事务隔离级别

天涯浪子 提交于 2019-11-27 17:13:39
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一、事务的基本要素(ACID)    1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。    2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。    3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。    4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。 二、事务的并发问题   1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据   2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。   3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级

mysql死锁(锁与事务)

瘦欲@ 提交于 2019-11-27 17:13:16
线上某服务时不时报出如下异常(大约一天二十多次):“Deadlock found when trying to get lock;”。 Oh, My God! 是死锁问题。尽管报错不多,对性能目前看来也无太大影响,但还是需要解决,保不齐哪天成为性能瓶颈。 为了更系统的分析问题,本文将从死锁检测、索引隔离级别与锁的关系、死锁成因、问题定位这五个方面来展开讨论。 1 死锁是怎么被发现的? 1.1 死锁成因&&检测方法 左图那两辆车造成死锁了吗?不是!右图四辆车造成死锁了吗?是! 我们mysql用的存储引擎是innodb,从日志来看,innodb主动探知到死锁,并回滚了某一苦苦等待的事务。问题来了,innodb是怎么探知死锁的? 直观方法是在两个事务相互等待时,当一个等待时间超过设置的某一阀值时,对其中一个事务进行回滚,另一个事务就能继续执行。这种方法简单有效,在innodb中,参数innodb_lock_wait_timeout用来设置超时时间。 仅用上述方法来检测死锁太过被动,innodb还提供了wait-for graph算法来主动进行死锁检测,每当加锁请求无法立即满足需要并进入等待时,wait-for graph算法都会被触发。 1.2 wait-for graph原理 我们怎么知道上图中四辆车是死锁的?他们相互等待对方的资源,而且形成环路!我们将每辆车看为一个节点

【MySQL】数据库事务深入分析

一世执手 提交于 2019-11-27 16:43:48
一、前言 只有InnoDB引擎支持事务,下边的内容均以InnoDB引擎为默认条件 二、常见的并发问题 1、脏读 一个事务读取了另一个事务未提交的数据 2、不可重复读 一个事务对同一数据的读取结果前后不一致。两次读取中间被其他事务修改了 3、幻读 幻读是指事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致。幻读和不可重复读的区别在于,不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据。因而幻读通常出现在带有查询条件的范围查询中 三、事务隔离级别 1、读未提交(READ UNCOMMITTED) 可能产生脏读、不可重复读、幻读 2、读已提交(READ COMMITTED) 避免了脏读,可能产生不可重复读、幻读 3、可重复读(REPEATABLE READ)(mysql默认隔离级别) 避免了脏读,不可重复读。通过区间锁技术避免了幻读 4、串行化(SERIALIZABLE) 串行化可以避免所有可能出现的并发异常,但是会极大的降低系统的并发处理能力 四、数据库日志有哪些? 1、undo日志 undo日志用于存放数据修改被修改前的值 UNDO LOG中分为两种类型,一种是 INSERT_UNDO(INSERT操作),记录插入的唯一键值; 一种是 UPDATE_UNDO(包含UPDATE及DELETE操作),记录修改的唯一键值以及old column记录。

MySQL数据库事务隔离级别

别说谁变了你拦得住时间么 提交于 2019-11-27 16:02:31
一.问题 1.脏读 已知有 两个事 务 A 和 B, A读取了已经被B更新但还没有被提交的 数据, 之后 , B回滚 事务, A读取的 数据就是脏数据 场景:公司发工资了,领导把5000元打到Tom的账号上,但是该事务并未提交,而Tom正好去查看账户,发现工资已经到账,账户多了5000元,非常高兴,可是不幸的是,领导发现发给Tom的工资金额不对,是2000元,于是迅速回滚了事务,修改金额后,将事务提交,Tom再次查看账户时发现账户只多了2000元,Tom空欢喜一场,从此郁郁寡欢,走上了不归路…... 分析:上述情况即为脏读,两个并发的事务:“事务B:领导给Tom发工资”、“事务A:Tom查询工资账户”,事务A读取了事务B尚未提交的数据 2.不可重复读 已知有 两个事 务 A 和 B ,A 多次读取同一数据,B 在A多次读取的过程中对数据作了 修改 并提交,导致A多次读取同一数据时,结果不一致,例子: 场景:Tom拿着工资卡去消费,酒足饭饱后在收银台买单,服务员告诉他本次消费 1 000 元 ,Tom将银行卡给服务员,服务员将银行卡插入POS机,POS机读到卡里余额为 3000元 ,就在Tom磨磨蹭蹭输入密码时,他老婆以迅雷不及掩耳盗铃之势把Tom工资卡的 3 000元 转到自己账户并提交了事务,当Tom输完密码并点击“确认”按钮后,POS机检查到Tom的工资卡已经没有钱,扣款失败

Nosql

那年仲夏 提交于 2019-11-27 15:58:43
单机MySQL的美好时代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。 在那个时候,更多的都是静态网页,动态交互类型的网站不多 初期架构 | center DAL,(Data Access Layer)。其功能主要是负责数据库的访问。简单地说就是实现对数据表的Select(查询)、Insert(插入)、Update(更新)、Delete(删除)等操作。 上述架构下,我们来看看数据存储的瓶颈是什么? 1、数据量的总大小 一个机器放不下时。(表要占空间,表的索引要占空间) 2、数据的索引(B+ Tree树)一个机器的内存放不下时库 3、访问量(读写混合)一个实例不能承受,(读写一个库) 真正意义上的库应该是主从复制,读写分离,而mysql等数据库只能自己从自己的库中读与写,也就是自己和自己玩。 如果满足了上述1 or 3个,则需要进化.. Memcached(缓存,java上还有一个ehcache)+MySQL+垂直拆分 后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力, 优化数据库的结构和索引 。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享

MySQL相关

梦想与她 提交于 2019-11-27 15:58:40
一、SELECT语句的执行顺序 from->on->join->where->group by->聚集函数->having->计算表达式->select->distinct->order by->top 二、存储过程 存储过程是一个可编程的函数,它在数据库中创建并保存。优点有: 1、存储过程能实现较快的执行速度 2、存储过程允许标准组件式编程。 3、存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 4、存储过程可被作为一种安全机制来充分利用。 5、存储过程能够减少网络流量 存储过程和函数的异同点 相同点:存储过程和函数都是为了可重复的执行操作数据库的sql 语句的集合。 不同点: 1、标识符不同,函数的标识符是function,存储过程是proceduce。 2、函数中有返回值,且必须有返回值,而过程没有返回值,但是可以通过设置参数类型(in,out)来实现多个参数或者返回值。 3、函数使用select 调用,存储过程需要使用call 调用。 三、事务的特性 1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。 2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。 3、隔离性(Isolation):事务的执行不受其他事务的干扰