mysql update语句

Mysql死锁

若如初见. 提交于 2020-01-08 16:11:01
mark下自己近期在电商开发中遇到的一个问题-数据库死锁及其排查过程。 先抛一个业务报错日志做为这次梳理的开始 上图是我接收到的错误报警,SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction,错误信息显示我们业务中有一条数据库操作遇到了死锁情况。接下来就开始我们的追查之旅。 1.执行“show engine innodb status”获取INNODB引擎当前信息( show engine innodb status 详细介绍 ) ------------------------ LATEST DETECTED DEADLOCK ------------------------ 2017-01-04 09:25:17 7f553477d700 *** (1) TRANSACTION: TRANSACTION 124378994, ACTIVE 0.007 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 4 lock struct(s), heap size 1184, 8 row lock(s), undo log entries

mysql 行级锁问题

巧了我就是萌 提交于 2020-01-08 11:52:25
线上碰到存储过程死锁问题了,开始以为非主键查询 for update 会导致表锁,后来经过测试 innodb下for update索引生效的情况下 根据索引字段查询是行级锁, 会将整个结果集进行上锁,直到事务结束。 错误地方进行一些修正,一般情况的确是将索引的结果集进行上锁,但是由于表过大的情况,mysql为了性能自动优化将索引附近的结果集全部进行上锁。 具体实验过程可以看 https://blog.csdn.net/qq_31975227/article/details/103710018 ,自己做一遍也能实验出来。 但是存储过程死锁的问题还是没有解决,不过该存储过程只是进行内存统计数据的落库,所以不应该上锁。虽然程序是node调用,但是也不会出现执行顺序问题,如果出现了执行顺序问题加了行级锁也是没有用的,又不是在源数据进行加减等计算操作,计算操作都在内存完成了,最后只进行了落库操作。( 来至个人的吐槽,我没办法说法领导, 后来和领导沟通说明白了问题) 死锁的问题通过分析死锁日志文件解决了,由于上面一块错误的认识。一直认为两个非唯一索引可以命中单条记录,其实mysql为了性能命中了多条。 一个简单的update语句,update ? where id1=1 and id2=2 id1和id2 都是非唯一索引,这时有的语句会对因为优化导致上锁其他索引周边的数据条目

mysql练习

走远了吗. 提交于 2020-01-08 09:31:40
今天从新下载了mysql,对着菜鸟教程里面的步骤操作了一次。 1.SELECT SELECT * FROM table_name; 2. SELECT DISTINCT SELECT DISTINCT column_name,column_name FROM table_name; 3. WHERE WHERE子句用于提取那些满足指定条件的记录 SELECT column_name,column_name FROM table_name WHERE column_name operator value; 在上个实例中 'CN' 文本字段使用了单引号。 如果是数值字段,请不要使用引号。 between and (在 之间的值) Like模糊查询, % 表示多个字值, _ 下划线表示一个字符; 4.AND & OR AND & OR 运算符用于基于一个以上的条件对记录进行过滤。 5.ORDER BY ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字 SELECT column_name,column_name FROM table_name ORDER BY column_name,column_name ASC|DESC; 6. INSERT INTO INSERT INTO 语句用于向表中插入新记录。 INSERT

MySQL基本操作

梦想与她 提交于 2020-01-08 08:02:46
MySQL添加用户、删除用户与授权 MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户   1.1 登录MYSQL:   @>mysql -u root -p   @>密码   1.2 创建用户:   mysql> insert into mysql.user(Host,User,Password) values( "localhost","test",password("1234") );   这样就创建了一个名为:test 密码为:1234 的用户。    注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。   1.3 然后登录一下:   mysql>exit;   @>mysql -u test -p   @>输入密码   mysql>登录成功 2.为用户授权   授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";    2.1 登录MYSQL(有ROOT权限),这里以ROOT身份登录:   @>mysql -u root -p   @>密码   2.2 首先为用户创建一个数据库

pymysql

微笑、不失礼 提交于 2020-01-07 22:41:27
*/ /*--> */ 目录 About pymysql Install 准备 建立连接 创建数据库 快速上手之增删改查 增 删 改 查 SQL注入 事物 存储过程 返回Python目录 返回测试目录 返回随笔首页 About pymysql 返回顶部 在Python2.x中,Python连接MySQL服务器使用mysqldb库,但是它只支持到Python2.x,在Python3.x中由pymysql模块代替。 PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。 Install 返回顶部 pip install pymysql # 备用地址 pip install -i https://pypi.doubanio.com/simple pymysql 准备 返回顶部 在正式操作前,这里默认你有了一个良好的环境,包括MySQL服务,Python环境。 建立连接 返回顶部 import pymysql conn = pymysql.connect( host='localhost', # 连接的服务器ip user='username', # 用户名 password='password', # 密码 database='day31', # 你想连接的数据库 charset='utf8' # 指定字符编码

mysql的查询优化

落爺英雄遲暮 提交于 2020-01-07 21:54:44
参考网站: http://www.liyblog.top/p/6 这里总结了52条对sql的查询优化,下面详细来看看,希望能帮助到你 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2,应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。 3,应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。 4,应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描, 可以 使用UNION合并查询: select id from t where num=10 union all select id from t where num=20 5,in 和 not in 也要慎用,否则会导致全表扫描,对于连续的数值,能用 between 就不要用 in 了:Select id from t where num between 1 and 3 6,下面的查询也将导致全表扫描:select id from t where name like ‘%abc%’

mysql的查询优化

半腔热情 提交于 2020-01-07 21:53:12
参考网站: http://www.liyblog.top/p/6 这里总结了52条对sql的查询优化,下面详细来看看,希望能帮助到你 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2,应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。 3,应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。 4,应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描, 可以 使用UNION合并查询: select id from t where num=10 union all select id from t where num=20 5,in 和 not in 也要慎用,否则会导致全表扫描,对于连续的数值,能用 between 就不要用 in 了:Select id from t where num between 1 and 3 6,下面的查询也将导致全表扫描:select id from t where name like ‘%abc%’

Python MySQL Update

人盡茶涼 提交于 2020-01-07 17:07:50
更新表 可以使用“UPDATE”语句,更新表格内的现有记录: 示例 将地址栏由“Valley 345”改写为“Canyoun 123”: import mysql.connector mydb = mysql.connector.connect( host="localhost", user="你的用户名", passwd="你的密码", database="mydatabase" ) mycursor = mydb.cursor() sql = "UPDATE customers SET address = 'Canyon 123' WHERE address = 'Valley 345'" mycursor.execute(sql) mydb.commit() print(mycursor.rowcount, " 条记录已更新") 复制 注意: 数据库修改后,需要使用mydb.commit()语句提交,不提交,修改不会生效。 注意UPDATE语句中的WHERE子句: WHERE子句指定应该更新哪些记录。如果省略WHERE子句,将更新所有记录! 防止SQL注入 在update语句中,为了防止SQL注入,通常应该转义查询值。 SQL注入是一种常见的web黑客技术,用于破坏或误用数据库。www.cdxsxbx.com mysql.connector 模块有方法可以转义查询值: 示例

【MySQL】悲观锁&乐观锁

送分小仙女□ 提交于 2020-01-07 15:59:39
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念。本文将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍。 悲观锁(Pessimistic Lock) 悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁。当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。 这里需要注意的一点是不同的数据库对select for update的实现和支持都是有所区别的,例如oracle支持select for update no wait,表示如果拿不到锁立刻报错,而不是等待,mysql就没有no wait这个选项。另外mysql还有个问题是select for update语句执行中所有扫描过的行都会被锁上

MySQL_怎么解决当前读的幻读问题

随声附和 提交于 2020-01-07 13:14:54
幻读 学习检测 gap lock 和next-key lock 在什么隔离级别下? 加锁格则是什么? 有索引字段、普通索引字段、唯一索引字段加锁格则是什么,会产生什么后果? limit 语句加锁格则 怎么查看表的锁定情况 范围锁遵循锁优化规则吗? select 是什么读,什么情况需要gap lock 和next-key lock? 记录不存在的时候,产生什么锁?加锁范围 读已提交的锁的特点 最后踢出问题,问什么要有锁来防止幻读呢? 学习总结 在 read replace隔离级别下才会产生 加锁规则 加锁的基本单位是next-key lock 锁是加载扫描过的索引上的 等值查询,唯一索引会将next-key lock 退化为行锁 等值查询,普通索引,查询到最后一个不满的索引记录时候,会退化为gap lock 唯一索引范围查询 <=的时候会查找到最后一个不满足条件的语句才结束 也就是说范围查询没有这些 gap lock 是开区间 next-key lock是前开后闭区间 有索引字段, 被索引覆盖 的时候锁只在索引上, 无索引字段, 会锁住整张表 唯一索引,会退化为行锁 limit 语句查找的时候不会有向后遍历的操作,数据 1,5,5,10加锁范围是(1,5]就结束了,不会产生(5,10)的gap lock select * from information_schema.innodb