mysql事务

MySQL死锁

冷暖自知 提交于 2020-01-18 03:56:52
Reference: https://time.geekbang.org/column/article/117247 死锁产生 行锁的具体实现算法有三种:record lock、gap lock以及next-key lock。 record lock是专门对索引项加锁; gap lock是对索引项之间的间隙加锁; next-key lock则是前面两种的组合,对索引项及其之间的间隙加锁。 只在可重复读或以上隔离级别下的特定操作才会取得gap lock或next-key lock,在Select、Update和Delete时,除了基于唯一索引的查询之外,其它索引查询时都会获取gap lock或next-key lock,即锁住其扫描的范围。主键索引也属于唯一索引,所以主键索引是不会使用gap lock或next-key lock。 在MySQL中,gap lock默认是开启的,即innodb_locks_unsafe_for_binlog参数值是disable的,且MySQL中默认的是RR事务隔离级别。 当执行以下查询SQL时,由于order_no列为非唯一索引,此时又是RR事务隔离级别,所以SELECT的加锁类型为gap lock,这里的gap范围是(4,+∞)。 1 SELECT id FROM demo.order_record where order_no = 4 for

mysql死锁问题分析

▼魔方 西西 提交于 2020-01-18 03:55:12
参考了这篇文章: http://www.cnblogs.com/LBSer/p/5183300.html 《 mysql死锁问题分析 》 写的不错。 如果Mysql死锁,会报出: 1.1 死锁成因&&检测方法 我们mysql用的存储引擎是innodb,从日志来看,innodb主动探知到死锁,并回滚了某一苦苦等待的事务。问题来了,innodb是怎么探知死锁的? 直观方法是在两个事务相互等待时,当一个等待时间超过设置的某一阀值时,对其中一个事务进行回滚,另一个事务就能继续执行。这种方法简单有效,在innodb中,参数innodb_lock_wait_timeout用来设置超时时间。 仅用上述方法来检测死锁太过被动,innodb还提供了 wait-for graph算法 来主动进行死锁检测,每当加锁请求无法立即满足需要并进入等待时,wait-for graph算法都会被触发。 1.2 innodb隔离级别、索引与锁 1.2.1 锁与索引的关系 假设我们有一张消息表(msg),里面有3个字段。假设id是主键,token是非唯一索引,message没有索引。 id: bigint token: varchar(30) message: varchar(4096) innodb对于主键使用了 聚簇索引 ,这是一种数据存储方式,表数据是和主键一起存储,主键索引的叶结点存储行数据。对于普通索引

使用xtrabackup备份MySQL数据库

断了今生、忘了曾经 提交于 2020-01-17 21:54:28
前言 Xtrabackup提供了两种命令行工具: xtrabackup:专用于备份InnoDB和XtraDB引擎的数据; innobackupex:是一个perl脚本,在执行过程中会调用xtrabackup命令,这个命令即可以实现备份InnoDB,也可以备份Myisam引擎的对象。 xtrabackup是由percona提供的MySQL数据库备份工具,其备份速度快并且可靠;备份过程不会打断正在执行的事务;能够基于压缩等功能节约磁盘空间和流量;自动实现备份检验;还原速度快。 若需要安装xtrabackup,可以移步其 官方网站 ,在其官网上提供了多种安装方式。 博文大纲: 一、安装xtrabackup及其插件 二、xtrabackup完全备份+binlog增量备份 三、xtrabackup完全备份+xtrabackup增量备份 四、innobackupex全库备份+innobackupex增量备份 注:二、三、四是三种不同的备份方案,在生产环境中选择合适的一种即可。 一、安装xtrabackup及其插件 1、yum安装xtrabackup 参考 官方文档 ,在官方文档上提供了各个版本的帮助说明。 [root@mysql ~]# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

MySQL事务的实现原理

[亡魂溺海] 提交于 2020-01-17 21:38:58
特点 原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability) 一、事务的目的 1、可靠性和并发处理 可靠性:数据库要保证当insert或update操作时抛异常或者数据库crash的时候需要保障数据的操作前后的一致,想要做到这个,我需要知道我修改之前和修改之后的状态,所以就有了undo log和redo log。 并发处理:也就是说当多个并发请求过来,并且其中有一个请求是对数据修改操作的时候会有影响,为了避免读到脏数据,所以需要对事务之间的读写进行隔离,至于隔离到啥程度得看业务系统的场景了,实现这个就得用MySQL 的隔离级别。 二、实现事务功能的三个技术 1、日志文件(redo log 和 undo log) 2、锁技术 3、MVCC 1.1 redo log 与 undo log介绍 1.1.1redo log 什么是redo log ? redo log叫做重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。 当事务提交之后会把所有修改信息都会存到该日志中。假设有个表叫做tb1(id,username) 现在要插入数据(3,ceshi) start transaction; select

MySQL数据库之--事物机制

假如想象 提交于 2020-01-17 21:30:30
事物机制 5.0版本后出现的,解决: 避免写入直接操作数据文件,直接操作数据文件是很危险的事 MySQL有5种日志文件,其中只有redo日志和undo日志与事物有关 RDBMS=SQL语句 + 事务(ACID) 原子性 事务是一个或者多个SQL语句组成的整体,要么全部执行成功,要么全都执行失败 ,事务执行之后,不允许停留在中间某个状态 把10部门中MANGER员工调往20部门,其他岗位员工调往30部门,然后删除10部门 事务: 开启事务 UPDATE语句 DELETE语句 提交事务 默认情况下,MySQL执行每条SQL语句都会自动开启和提交事务 为了让多条SQL语句纳入一个事务下,可以手动管理事务 START TRANSACTION; SQL语句 [COMMIT | ROLLBACK]; COMMIT:持久化提交 ROLLBACK:回滚 START TRANSACTION; -- 启动事务机制 delete from t_emp; delete from t_dept; SELECT * FROM t_emp; SELECT * FROM t_dept; -- COMMIT; -- 提交同步(给注释掉了) ROLLBACK ; -- 回滚不同步 事务的一致性 不管在任何给定的时间\并发事务有多少, 事务必须保证运行结果的一致性,不允许数据歧义 隔离性

JDBC简介

删除回忆录丶 提交于 2020-01-17 20:43:43
JDBC操作数据库的步骤 ? 注册数据库驱动。 建立数据库连接。 创建一个Statement。 执行SQL语句。 处理结果集。 关闭数据库连接 代码如下 JDBC中的Statement 和PreparedStatement,CallableStatement的区别? 区别: PreparedStatement是预编译的SQL语句,效率高于Statement。 PreparedStatement支持?操作符,相对于Statement更加灵活。 PreparedStatement可以防止SQL注入,安全性高于Statement。 CallableStatement适用于执行存储过程。 JDBC中大数据量的分页解决方法? 最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。 说说数据库连接池工作原理和实现方案? 工作原理: JAVA EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。 实现方案: 连接池使用集合来进行装载,返回的Connection是原始Connection的代理

JDBC之简介

梦想的初衷 提交于 2020-01-17 20:09:16
5、JDBC的API java.sql包和javax.sql包 DriverManager类(驱动管理器),它可以创建连接,它本身就是一个创建Connection的工厂(Factory)。 Driver接口 入口 Connection接口,会根据不同的驱动产生不同的连接 Statement接口,发送sql语句 ResultSet接口(结果集),是用来接收select语句返回的查寻结果的。其实质类似于集合。 以上的资源都需要释放,释放的是数据库的资源 JDBC应用步骤 1,注册加载一个driver驱动 2,创建数据库连接(Connection) 3,创建一个Statement(发送sql) 4,执行sql语句 5,处理sql结果(select语句) 6,关闭Statement 7,关闭连接Connection。 注意:6,7两个步骤势必须要做的,因为这些资源是不会自动释放的,必须要自己关闭 访问Oracle的数据库的驱动名字叫o加到环境变量PATH中。 jdbc14.jar,这个jar文件中出访的驱动程序的.class文件 要使用这个驱动程序,要先将他 一,注册加载驱动driver,也就是强制类加载 1 、 Class.forName(driver); driver = "oracle.jdbc.driver.OracleDriver"; 2 、 Driver d=new

事务(包含Java程序)

倾然丶 夕夏残阳落幕 提交于 2020-01-17 06:02:30
什么是事务 事务是一个工作单元,该单元内的所有操作是一个整体,要么全部执行成功,要么就全部失败。只要有任一个单元操作失败,则操作全部失败。 注意 :事务主要加在对数据库数据发送改变的操作中,例增删改,像查询则不需要事务 为什么需要事务 SQL语句只能执行一条,而事务可以把多个SQL语句组成一个事务,同时执行 事务的四大特性(ACID) 标记: 面试题 1、 原子性(Atomicity) :事务中的所有操作是不可再分割的原子单位,要么全部成功,要么全部失败 标记: 红色 2、 一致性(Consistency) :事务执行后,数据库状态与其他业务规则保持一致。 标记: 红色 如: 转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。 3、 隔离性(Isolation) :隔离性是指在并发操作中,不同事务之间应该隔离起来,使每个并发中的事务不会互相干扰 标记: 红色 4、 持久性(Durability) :一旦事务提交成功,事务中的所有操作都必须被持久化到数据库中,即使提交事务后,数据库马上奔溃,在数据库重启时,也必须能保证通过某种机制恢复数据 标记: 红色 MySQL中的事务 标记: 红色 例: #胡一刀给胡一菲转账500元 START TRANSACTION ; UPDATE bank SET cmoney = cmoney + 500 WHERE cname =

Mysql查漏补缺笔记

雨燕双飞 提交于 2020-01-17 05:17:03
目录 查漏补缺笔记2019/05/19 文件格式后缀 丢失修改,脏读,不可重复读 超键,候选键,主键 构S(Stmcture)/完整性I(Integrity)/数据操纵M(Malippulation) 关系范式 系统设计 数据库语言 两段协议 SQL联表查询,函数substr,right 查漏补缺笔记2019/05/19 文件格式后缀 数据库文件的扩展名为.DBC 数据表文件的扩展名为 .DBF 表单文件的扩展名为 .SCX 项目文件的扩展名为 .PJX 丢失修改,脏读,不可重复读 事务之间的对数据的并发操作会带来三种问题:丢失修改,脏读,不可重复读。 丢失修改:一个事务读取一个数据时,另外一个事务也访问该同一数据。那么,在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 脏读:当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,根据脏数据的操作可能是不正确的。 不可重复读:一个事务内多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,这就发生了在一个事务内两次读到的数据是不一样的情况

mysql group replication观点及实践

瘦欲@ 提交于 2020-01-17 04:56:51
一:个人看法 Mysql Group Replication 随着5.7发布3年了。作为技术爱好者。mgr 是继 oracle database rac 之后。 又一个“真正” 的群集,怎么做到“真正” ? 怎么做到解决复制的延迟,怎么做到强数据一致性?基于全局的GTID就能解决? 围绕这些问题进行了一些mgr 的实践, 为未来的数据库高可用设计多条选择。 mysql5.7手册17章可以看到其原理,网络上也很多同志写了关于其技术原理,这里自己对比rac理解下: 作为shared nothing (mgr)架构,其数据一致性实现较 shared everything(RAC) 架构要难, MGR通过一致性(Paxos)协议,保证数据在复制组内的存活节点里是一致的,复制组内的各成员都可以进行读写, 其实现机制是,当某个实例发起事务提交时,会向组内发出广播,由组内成员决议事务是否可以正常提交, MGR 在遇到事务冲突时(多节点同时修改同一行数据),会自动识别冲突,并根据提交时间让先提交的事务成功执行,后提交的事务回滚,其原理示意图如下: 对于 sharad nothing 架构,必须要了解分布式协议PAXOS,分布式状态机 理论,而在这块我翻阅了很多资料,发现其实并不是很成熟的。从上图可以看出来MGR 的冲突检测机制 类似于 rac 的gird 群集组件 也具备通告广播的群集服务