mysql事务

MySQL 锁的一些简单概念

故事扮演 提交于 2020-03-08 01:06:09
1. 锁的粒度 在MySQL中,只要有多个请求需要在同一时刻修改数据,都会产生并发控制的问题。而锁的作用可以保证同一资源能被某个请求唯一使用。 加锁是会消耗系统资源的,包括获得锁、检查锁是否已解除、释放锁等等操作,都会增加系统的开销。 为了平衡锁的开销和数据的安全性,MySQL对锁的粒度提供了多种方式,主要分为表锁和行级锁。 表锁(table lock) :指在加锁时锁定整张表。 行级锁(row lock) :指在加锁时锁定某一行。 2. 共享锁和排他锁 在InnoDB存储引擎中,锁的类型通常分为共享锁和排他锁。 共享锁(shared lock) :也叫读锁(read lock),指多个请求在同一时刻可以同时读取同一个资源,互相不干扰。 排他锁(exclusive lock) :也叫写锁(write lock)。一个写锁会阻塞其他的写锁和读锁,这样能确保一定的时间内,只有一个请求能执行写入操作,防止其他请求读取或写入同一资源。 示例1: 事务T1对某一行R1进行了共享锁的加锁操作时,事务T2也可以对此行R1进行共享锁的加锁操作,但事务T2不可以对此行R1进行排他锁操作。 示例2: 事务T1对某一行R1进行了排他锁的加锁操作时,事务T2不能对此行R1进行任一类型的锁的请求,事务T2必须等待事务T1释放对行R1的锁定才能进行后续的加锁操作。 3. 死锁

高性能MySQL之锁详解

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

MySQL——存储引擎

眉间皱痕 提交于 2020-03-07 14:04:22
MySQL体系结构如下: 下面介绍一下MySQL的存储引擎: MyISAM: MyISAM是MySQL5.5之前版本的默认存储引擎,在之后的版本中,系统表和临时表会使用到这个存储引擎; 由MYD和MYI组成(数据文件和索引文件),是MyISAM特有的,frm文件用来记录表结构,所用存储引擎都有这个文件; 表级锁,并发性不好; 不支持事务; 支持数据压缩; InnoDB: MySQL是MySQL5.5之后版本的默认存储引擎, 支持事务; 行级锁; 建议使用独立表空间: Redo log(已经提交的事务日志) 和Undo log(未提交的事务日志); 来源: https://www.cnblogs.com/gaoquanquan/p/12433681.html

mysql(视图 事务 索引 外键)

流过昼夜 提交于 2020-03-07 13:06:19
视图 视图本质就是对查询的封装 创建视图(定义视图 起名以v_开头) create view v_students as select classes.name as c_name ,students.* from students inner join classes on students.cls_id=classes.id; 查看视图 select * from v_students; 删除视图 drop view v_students; 事务 事务具有ACID特性: 原子性(A,atomicity) 一致性(C,consistency) 隔离性(I,isolation) 持久性(D,durabulity) 原子性:事务内所有操作要么都执行,要么都不执行,它是一个不可分割的工作单位 例如: A给B转账,不会因为各种原因A账号已经发生扣款而B账户没有收到加款。 一致性:事务开始和结束前后,数据库的完整性没有被破坏 案例: 对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNT表中aaa和bbb的存款总额为2000元。 隔离性:事务之间不相互影响,多个事务并发访问时,事务之间是隔离的 事务查看数据更新时,数据所处状态要么是另一事务修改之前或者修改之后的状态,不会查看到中间状态的数据。事务1在修改表的时候提交之前事务2不能修改 持久性:事务完成一手

Python连接MySQL数据库之pymysql模块使用

依然范特西╮ 提交于 2020-03-07 08:23:59
Python连接MySQL数据库之pymysql模块使用 Python3连接MySQL 本文介绍Python3连接MySQL的第三方库--PyMySQL的基本使用。 PyMySQL介绍 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。 Django中也可以使用PyMySQL连接MySQL数据库。 PyMySQL安装 pip install pymysql 连接数据库 注意事项 在进行本文以下内容之前需要注意: 你有一个MySQL数据库,并且已经启动。 你有可以连接该数据库的用户名和密码 你有一个有权限操作的database 基本使用 # 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() # 定义要执行的SQL语句 sql = """ CREATE TABLE USER1 ( id INT auto_increment PRIMARY KEY , name CHAR(10) NOT NULL UNIQUE

Spring 集成 JOTM 的 JTA 事务管理

时光总嘲笑我的痴心妄想 提交于 2020-03-06 15:56:29
Spring 中集成 JOTM 配置 JTA 事务: 假如业务中要用到多个数据库,我们希望在业务方法中,当对某一个数据库的数据表进行操作的事务失败并回退(rollback),另外某一个数据库的数据表的操作事务也要回退,但应用一般的事务管理达不到这样的事务管理效果,这就需要实现 JTA 事务管理了。 这里我们在SPring中集成 Object web 的一个开源JTA实现JOTM (可以在 http://jotm.objectweb.org 下载完整版) 来实现JTA事务管理。 1、将必须的类包放入类路径中: jotm.jar, xapool.jar, jotm_jrmp_stubs.jar, jta-spect1_0_1.jar, connector-1_5.jar等等。 2、编写JOTM配置文件carol.properties,将其放到类路径下: Java代码 #JNDI调用协议 carol.protocols=jrmp #不使用CAROL JNDI封装器 carol.start.jndi= false #不启动命名服务器 carol.start.ns= false #JNDI调用协议 carol.protocols=jrmp #不使用CAROL JNDI封装器 carol.start.jndi=false #不启动命名服务器 carol.start.ns=false 3

Spring Transaction + MyBatis SqlSession事务管理机制研究学习

这一生的挚爱 提交于 2020-03-06 08:57:04
线上的系统中,使用的是Spring+Mybatis+Mysql搭建的框架,由于客户需要,最近一直在对性能提升部分进行考虑,主要是涉及Mysql的一些重要参数的配置学习,以及Spring事务管理机制的学习,因为通过观察服务器日志,发现在这两部分的时候耗时比较严重,特别是进行mysql事务提交的时候,项目源码中使用了Spring的声明式事务,即通过@Transactional注解来控制事务的开启与提交,这两天看了一些关于Spring Transaction事务的一些文章,也debug了源码,总算有点心得和疑问,这里简单的整理一下。 在Spring的配置文件中,我们使用了"org.springframework.jdbc.datasource.DataSourceTransactionManager"对事务进行管理,翻开 DataSourceTransactionManager的源码,我们看到 DataSourceTransactionManager继承了AbstractPlatformTransactionManager(抽象的事务管理器), DataSourceTransactionManager 重写了其中的一些方法,具体每个方法的作用,限于篇幅 ,本文不再赘述 ,这里 《Spring技术内幕》学习笔记16——Spring具体事务处理器的实现 有详细的介绍。 在现有的项目中

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

优化数据库

谁都会走 提交于 2020-03-05 16:29:44
1、选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。 例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。 另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOTNULL ,这样在将来执行查询的时候,数据库不用去比较NULL值。 对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。 2、使用连接(JOIN)来代替子查询(Sub-Queries) MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询,如下所示:

[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. 什么是事务? 答