mysql事务

mysql 开发基础系列20 事务控制和锁定语句(上)

匿名 (未验证) 提交于 2019-12-02 22:06:11
一.概述   在mysql 里不同存储引擎有不同的锁,默认情况下,表锁和行锁都是自动获得的,不需要额外的命令, 有的情况下,用户需要明确地进行锁表或者进行事务的控制,以便确保整个事务的完整性。这样就需要使用事务控制和锁定语句来完成。 特点 myisam innodb memory merge ndb 事务安全 支持 锁机制 表锁 表锁 行锁(默认) 表锁 表锁 行锁 页锁(默认) 1. lock table 和nolock table   lock table是锁定当前线程的表。如果当前表被锁定,其它线程想获取该表的锁时,会一直等待,直到获取到该表锁为止。   下面演示一个获得表锁和释放表锁的简单例子,演示会话1 获取city表的read锁后,会话2更新该表记录时 会等待,当会话1 city表释放后, 会话2就会更新完成。   -- 步骤1 会话1获取city 表锁       --- 步骤2 会话2更新city表一直在等待      -- 步骤3 会话1 city表释放表锁       ---步骤4 会话2 city表更新成功     2. 事务控制   mysql 通过set autocommit, start transaction,commit 和rollback等语句支持本地事务 -- 语法如下 START TRANSACTION | BEGIN [ WORK ]

MySQL之事务、锁

匿名 (未验证) 提交于 2019-12-02 22:06:11
锁 一、概念   锁是计算机协调多个进程或线程访问某一个资源的机制。在数据库中,除传统的计算资源(CPU、RAM、IO)的争用意外,数据也是一种许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问的一个重要因素。从这个角度来说,锁对数据库尤其重要,也更加复杂。本文就以MyISAM和InnoDB两个引擎来说明锁的问题; 二、MySQL锁概述   相对其他数据库而言,MySQL的锁机制比较简单,其中最为显著的特点是不同的引擎具有不同的锁。比如MyISAM和InnoDB分别采用表锁、行锁,但是InnoDB也支持表锁,默认情况下采用行锁; 三、MySQL表锁和行锁对比 锁的名称 开销 加锁速度 死锁 粒度 并发性能 表锁 С 快 不会出现 大 最低 行锁 大 慢 出现 С 最高 从锁的角度来说表锁适合查询为主,只有少量按索引条件更新数据的应用;行锁适合于大量按索引条件来并发更新少量的数据,同时又有并发查询的应用; MyISAM表锁   可以通过table_locks_waited和table_locks_immediate来分析系统表锁的争夺; 如果table_locks_waited的值比较高的话,则说明存在较高的表锁争夺。 二、表锁的锁模式   表级锁有两种方式:读锁和写锁,锁模式的兼容性如下: 由上表可见

mysql数据类型

匿名 (未验证) 提交于 2019-12-02 22:06:11
关系型数据库的常见组件 数据库:database 表:table 行:row 列:column 索引:index 试图:view 用户:user 权限:privilege 存储过程:procedure 存储函数:function 触发器:trigger 事件调度器:event scheduler 错误日志:Error log 默认情况下错误日志大概记录以下几个方面的信息: 1、服务器启动和关闭过程中的信息(未必是错误信息,例如,mysql如何启动INNODB的表空间文件的、如何初始化自己的存储引擎的等) 2、服务器运行过程中的错误信息 3、事件调度器运行一个事件时产生的信息 4、在从服务器上启动服务器进程时产生的信息 注意: 1、可以根据自身需求设定不同错误日志的值 1=只记录 Errors 级别的日志 2=记录Errors、warnings 级别的日志 3=记录Errors、warnings、notes(defaults)级别的日志 2、如何删除旧的错误日志 在mysql5.7之前:数据库管理员可以删除很长时间之前的错误日志,以保证mysql服务器上的硬盘空间。mysql数据库中,可以使用mysqladmin命令开启新的错误日志: 命令语法如下:mysqladmin -u root -p flush_logs 也可以登陆mysql数据库中使用flush logs

Python与Mysql

匿名 (未验证) 提交于 2019-12-02 22:06:11
安装 安装 sudo apt-get install mysql-server mysql-client 然后按照提示输入 管理服务 启动 service mysql start ֹͣ service mysql stop 重启 service mysql restart 允许远程连接 找到mysql配置文件并修改 sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf 将bind-address=127.0.0.1注释 登录mysql,运行命令 grant all privileges on *.* to 'root'@'%' identified by 'mysql' with grant option; flush privileges; 重启mysql 字段类型 在mysql中包含的数据类型很多,这里主要列出来常用的几种 数字:int,decimal 字符串:char,varchar,text 日期:datetime,timestamp 布尔:bit 约束 主键primary key 非空not null Ωһunique 默认default 外键foreign key shell> mysql -u USERNAME -p PASSWORD -h IPV4 -p PORT 数据库操作 创建数据库 create database 数据库名

监控MySQL组复制

匿名 (未验证) 提交于 2019-12-02 22:06:11
使用 Perfomance Schema 中的表来监控组复制,假定你的MySQL编译时已经启动了 Performance Schema 表。组复制将添加如下两张 P_S 表: performance_schema.replication_group_member_stats performance_schema.replication_group_members 下面这些已存在的 P_S 复制表同样也显示一些组复制的信息。 performance_schema.replication_connection_status performance_schema.replication_applier_status 组复制插件创建的通道名称为: group_replication_recovery - 该通道在分布式恢复阶段进行复制。 group_replication_applier - 该通道在组中有新写入操作时进行复制。该通道是组中有新事务流入时使用的通道。 下面一些小节中将描述这些表中可以获取到的信息。 复制组中的每个成员都要验证并应用组提交的事务。关于验证者(certifier)和应用者(applier)相关的统计数据,有助于理解应用者队列(applier queue)是如何增长的、检测了多少次冲突、检测到多少个事务、哪些事务是到处提交的等等问题。 performance

事务的隔离性与MySql隔离级别

匿名 (未验证) 提交于 2019-12-02 22:06:11
事务的基本要素(ACID)有四个,分别是原子性,一致性,隔离性和持久性。 原子性和持久性很好理解,一致性是指事务执行过程中的状态对外是不可见的,要么是执行前的状态,要么是执行后的状态,执行前是一个一致的状态,执行后是另外一个一致性状态。比如银行卡a向银行卡b转账,转账这个事务中有两个操作:将钱从卡a转出,将钱转到卡b。转账事务执行之前状态是一致的,转账事务执行了第一个操作之后,状态是不一致的,此时a卡上的钱少了,但b卡上的钱没有增加,状态是不一致的。执行完第二个操作,即将钱转到b卡上后,才具备正确的逻辑意义,此时的状态又是一致的了。 事务的隔离性指并发事务之间互相影响的程度,实质上并发事务互不影响才是事务隔离性的要求。但是为了提高并发,不得不做出一些妥协,所以又将事务的隔离性从低到高分为四个级别。 1.1 Read Uncommitted 读未提交,最低的隔离级别,在此级别上一个事务可以读到另一个事务未提交的结果。因此会出现脏读问题,读到的数据是一个临时的,不正确的数据。 1.2 Read Committed 读已提交,相对于读未提交来说的,指只有当事务提交之后,其更新结果才可以被其他事务看到。可以解决脏读问题,但是会存在另外的问题:不可重复读。例如事务a在事务b多次读取过程中提交了更新,此时事务b读到的结果是不一致的。 1.3 Repeated Read 可重复读,指在一个事务中

mysql查询死锁信息

匿名 (未验证) 提交于 2019-12-02 22:06:11
INNODB_LOCKS表 INNODB_LOCKS表主要包含了InnoDB事务锁的具体情况,包括事务正在申请加的锁和事务加上的锁。 Column name Description lock_id 锁ID lock_trx_id 事务ID, 可以连INNODB_TRX表查事务详情 lock_mode S X IS IX S_GAP X_GAP IS_GAP IX_GAP AUTO_INC lock_type 锁的类型,行级锁 或者表级锁 lock_table 加锁的表 lock_index 如果是lock_type='RECORD' 行级锁 ,为锁住的索引,如果是表锁为null lock_space 如果是lock_type='RECORD' 行级锁 ,为锁住对象的Tablespace ID,如果是表锁为null lock_page 如果是lock_type='RECORD' 行级锁 ,为锁住页号,如果是表锁为null lock_rec 如果是lock_type='RECORD' 行级锁 ,为锁住页号,如果是表锁为null lock_data 事务锁住的主键值,若是表锁,则该值为null INNODB_TRX 表 INNODB_TRX表主要是包含了正在InnoDB引擎中执行的所有事务的信息,包括waiting for a lock和running的事务 Column name

mysql性能优化

匿名 (未验证) 提交于 2019-12-02 22:06:11
数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情 1.为查询缓存优化你的查询 mysql > show variables like ' %query_cache% ' ; (query_cache_type 为 ON 表示已经开启) + -- ----------------------------+----------+ | Variable_name | Value | + -- ----------------------------+----------+ | have_query_cache | YES | | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 20971520 | | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | + -- ----------------------------+----------+ 如果不是ON,修改配置文件以开启查询缓存: > vi / etc / my.cnf [ mysqld ] 中添加: query_cache

MYSQL存储过程中事务和DECLARE EXIT/CONTINUE HANDLER的使用

匿名 (未验证) 提交于 2019-12-02 22:06:11
1 -- 1、DECLARE EXIT HANDLER FOR SQLEXCEPTION 语句后面可以跟一个 begin end的复合语句块,也可以直接跟一个简单语句例如 :DECLARE EXIT HANDLER FOR SQLEXCEPTION v_succ=0; 3 -- 2、EXIT会在执行异常后执行执行 FOR SQLEXCEPTION 后的语句或块而整个停止下来;CONTINUE选项会在异常后继续执行,从而将id为2的记录写入到数据库中。 4 5 DROP PROCEDURE IF EXISTS p_test; 6 delimiter // 7 CREATE PROCEDURE p_test(OUT v_succ tinyint) 8 BEGIN 9 DECLARE EXIT HANDLER FOR SQLEXCEPTION 10 BEGIN 11 SET v_succ=0; 12 ROLLBACK; 13 END; 14 SET v_succ=1; 15 START TRANSACTION; 16 INSERT INTO tb_test (id) VALUES (1); 17 SIGNAL SQLSTATE '45001' SET MYSQL_ERRNO=2000,MESSAGE_TEXT='故意触发异常'; 18 INSERT INTO tb_test (id)

记一次Mysql事务隔离级别的坑

匿名 (未验证) 提交于 2019-12-02 22:06:11
最近在写代码调试时,遇到了一个问题。 具体操作如下: 1.调用方法A,并且方法A加上了@Transactional事务注解。 2.在方法A内部,查询并更新某个字段F的值。 3.处理其他逻辑。 4.查询并打印日志,记录关键字段的值,包括字段F。 5.方法A结束。 由于刚刚接手这块代码,而且这个方法又写得很长,所以很多逻辑都没法细看,只能慢慢调试。 我在第4步打了断点,调试时查看日志,感觉数据有问题,将sql复制到数据库里面手动跑了一遍, 发现 在方法里和数据库里,执行同一条Sql,结果竟然不一样。 一开始还有点蒙圈,以为是IDE的bug,可能是缓存之类的问题。 然后又调试了几遍,单步调试时观察到 手动在数据库里查出来的字段值,总是方法刚开始还未变更时的值 。 恍然才明白,原来是事务隔离级别造成的。 这些知识点,其实以前面试都背得滚瓜烂熟。现在时间久了,一下子又忘光了。 Q:数据库的隔离级别有哪些? 读未提交(read-uncommitted)读提交(read-committed) 可重复读(repeatable-read)串行化(serializable)。 Q:mysql默认的数据库隔离级别是什么? 可重复读(repeatable-read) Mysql采用INNODB存储引擎。SELECT操作,使用一致性非锁定读。 在READ COMMITTED事务隔离级别下,对于快照数据