mysql事务

mysql的优化(经典必看)

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

python操作MySQL数据库

时光毁灭记忆、已成空白 提交于 2019-12-16 16:00:58
MySQLdb呢,其实和Python内置的sqlite3的使用方法基本相同。 警告: 不要使用字符串拼接生成SQL语句,否则可能产生SQL注入的问题。应当使用 execute() 的第二个参数检查输入的合法性。 #do NOT do this! cmd = "update people set name='%s' where id='%s'" % (name, id) cur.execute(cmd) # instead, do this: cmd = "update people set name=%s where id=%s" cur.execute(cmd, (name, id)) 采用的是MySQLdb操作的MYSQL数据库。先来一个简单的例子吧: import MySQLdb try: conn=MySQLdb.connect(host='localhost',user='root',passwd='mysql',db='test',port=3306) cur=conn.cursor() cur.execute('select * from user') cur.close() conn.close() except MySQLdb.Error,e: print "Mysql Error %d: %s" % (e.args[0], e.args[1])

2.ZOOKEEPER_请求处理原理分析

。_饼干妹妹 提交于 2019-12-16 15:38:44
Zookeeper请求处理原理分析 数据库的原理 我们知道,数据库是用来存储数据的,只是数据可以存储在内存中或磁盘中。而Zookeeper实际是结合了这两种的,Zookeeper中的数据即会存储在磁盘中以达到持久化的目的,也会同步到内存中以到达快速访问的目的。 事实上,用过Zookeeper的同学应该知道,Zookeeper中有两种类型的节点: 持久化节点 和 临时节点 。 持久化节点:会持久化在磁盘中,除非主动删除,将一直存在。 临时节点:不会持久化在磁盘中,只会存储在内存中,创建这个临时节点的Session一旦过期,此临时节点也将自动被删除。 数据库处理数据的原理 作为一个数据库,肯定是要接收客户端创建、修改、删除、查询节点等请求的。 在Zookeeper中对于请求分为两类: 事务性请求 非事务性请求 事务性请求 Zookeeper通常都是以集群模式运行的,也就是Zookeeper集群中各个节点的数据需要保持一致的。但是和Mysql集群不一样的是: Mysql集群中,从服务器是异步从主服务器同步数据的,这中间的间隔时间可以比较长。 Zookeeper集群中,当某一个集群节点接收到一个写请求操作时,该节点需要将这个写请求操作发送给其他节点,以使其他节点同步执行这个写请求操作,从而达到各个节点上的数据保持一致,也就是数据一致性

数据库之锁详解

一曲冷凌霜 提交于 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空欢喜一场,从此郁郁寡欢,走上了不归路……

深入理解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读锁

高性能MySQL:03---事务介绍(START TRANSACTION、COMMIT、ROLLBACK、ACID性质)

坚强是说给别人听的谎言 提交于 2019-12-16 08:16:12
一、事务介绍 事务就 是一组原子性的SQL查询 ,或者说一个独立的工作单元。如 果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执 行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行, 那么所有的语句都不会执行 也就是说,事务内的语句, 要么全部执行成功,要么全部执行失败 二、事务的演示案例 银行应用是解释事务必要性的一个经典例子。假设一个银行的数据库有两张表:支票(checking)表和储蓄(savings)表。现在要从用 户Jane的支票账户转移200美元到她的储蓄账户,那么需要至少三个步骤: 1. 检查支票账户的余额高于200美元 2. 从支票账户余额中减去200美元 3. 在储蓄账户余额中增加200美元 上述三个步骤的操作必须打包在一个事务中, 任何一个步骤失败, 则必须回滚所有的步骤 三、事务的命令实现 可以 用START TRANSACTION语句开始一个事务 ,然后要么使用 COMMIT提交事务 将修改的数据持久保留,要么使用 ROLLBACK撤销所有的修改 以“二”中的演示案例为例,其事务的SQL样本如下: START TRANSACTION; SELECT balance FROM checking WHERE customer_id = 10233276; UPDATE checking SET balance = balance -

面试笔录--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