mysql事务

mysql共享锁与排他锁

不想你离开。 提交于 2020-02-28 05:48:49
mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。 对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from.

mysql事务详解

ぃ、小莉子 提交于 2020-02-28 03:31:55
事务的四大特性 1.原子性(Atomicity) 要么全做,要么全不做的规则称之为原子性。比如说转账,要么成功要么失败. 2.一致性(Consistency) 如果数据库中的数据全部符合现实世界中的约束(all defined rules),我们说这些数据就是一致的,或者说符合一致性的。比如身份证号不能重复 更多的一致性需求需要靠写业务代码的程序员自己保证。比如说金额不能小于0 , 性别只能是男或女. 3.隔离性(Isolation) 对某些数据库操作来说,不仅要保证这些操作以原子性的方式执行完成,而且要保证其它的状态转换不会影响到本次状态转换,这个规则被称之为隔离性。 4.持久性(Durability) 转换的结果将永久的保留,这个规则被称为持久性. 也就意味味着该转换对应的数据库操作所修改的数据都应该在磁盘上保留下来 MySQL中事务的语法 只有InnoDB和NDB存储引擎支持事务.如果表不支持事务,那么将无法回滚. 不显式的开启事务,那么每一条sql都是一个独立的事务 开启一个事务 BEGIN; START TRANSACTION; START TRANSACTION语句后边跟随几个修饰符,就是它们几个: READ WRITE:标识当前事务是一个只读事务 READ WRITE:标识当前事务是一个读写事务 WITH CONSISTENT SNAPSHOT:启动一致性读 提交事务

理解共享锁和排它锁

一曲冷凌霜 提交于 2020-02-27 14:23:31
1.共享锁 (lock in share mode) 1.1 概念 允许不同事务之前共享加锁读取,但不允许其它事务修改或者加入排他锁 如果有修改必须等待一个事务提交完成,才可以执行,容易出现死锁 1.2 例子: 共享锁事务读取 以不同的 session 来举例: a: start transaction; select * from demo where id = 1 lock in share mode; b: start transaction; select * from demo where id = 1 lock in share mode; 此时 a 和 b 都可以正常获取结果,那么再加入 c 排他锁读取尝试 c: start transaction; select * from demo where id = 1 for update; 在 c 中则无法获取数据,直到超时或其它事物 commit 共享锁事务更新 a: update demo set name = 'xxx' where id = 1; 可以很快获取执行结果。当 b 再次执行修改 id=1 的语句时: b: update demo set name = 'yyy' where id = 1; 就会出现死锁或者锁超时,错误如下: Deadlock found when trying to get lock

Spring事务失效的原因总结

纵饮孤独 提交于 2020-02-27 13:23:29
用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 不见得总结全,但希望可以帮忙有需要的人。 1、数据库引擎不支持事务 这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。 根据 MySQL 的官方文档: https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html 从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么搞都是白搭。 2、没有被 Spring 管理 如下面例子所示: // @Service public class OrderServiceImpl implements OrderService { @Transactional public void updateOrder ( Order order ) { // update order } } 如果此时把 @Service 注解注释掉,这个类就不会被加载成一个 Bean,那这个类就不会被 Spring 管理了,事务自然就失效了。 3、方法不是 public 的 以下来自 Spring 官方文档: When using proxies,

python面试题 -- 网编并发

白昼怎懂夜的黑 提交于 2020-02-27 12:21:54
Python面试重点(进阶篇) 注意:只有必答题部分计算分值,补充题不计算分值。 第一部分 必答题 简述 OSI 7层模型及其作用?(2分) # 应用层:文件传输,文件管理,电子邮件的信息处理# 表示层:确保一个系统的应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据解析,管理数据的解密和加密# 会话层:验证访问和会话管理# 传输层:为应用程序之间提供端对端的逻辑通信。# 网络层:选择合适的网间路由完成两个计算机之间的多个数据链路,通过路由协议和地址解析协议(ARP)。IP,RIP(路由信息协议),OSPF(最短路径优先协议)# 数据链路层:在物理层提供的比特流的基础上,建立相邻节点之间的数据链路,不可靠的物理介质提供可靠传输 ppp协议# 物理层:规定通信设备,通信链路的特性 简述 TCP三次握手、四次回收的流程。(3分) # 第一次握手:客户端首先向服务端发起连接,这时TCP头部中的SYN标识位值为1,然后选定一个初始序号seq=x(一般是随机的),消息发送后,A进入SYN_SENT状态,SYN=1的报文段不能携带数据,但要消耗一个序号。# 第二次握手:服务端收到客户端的连接请求后,同意建立连接,向A发送确认数据,这时TCP头部中的SYN和ACK标识位值均为1,确认序号为ack=x+1,然后选定自己的初始序号seq=y(一般是随机的),确认消息发送后,服务端进入SYN

Mysql 数据可靠性机制

試著忘記壹切 提交于 2020-02-27 05:55:04
Mysql 主要通过binlog 跟redolog 来保证数据的可靠性 binlog 的写入机制 binlog 的写入逻辑比较简单:事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中 一个事务的 binlog 是不能被拆开的,因此不论这个事务多大,也要确保一次性写入。 这就涉及到了 binlog cache的保存问题。 系统给 binlog cache 分配了一片内存,每个线程一个,参数 binlog_cache_size 用于控制单个线程内 binlog cache 所占内存的大小。如果超过了这个参数规定的大小,就要暂存到磁盘。 事务提交的时候,执行器把 binlog cache 里的完整事务写入到 binlog 中,并清空 binlog cache write,指的就是指把日志写入到文件系统的page cache,并没有把数据持久化到磁盘,所以速度比较快 fsync,才是将数据持久化到磁盘的操作。一般情况下,我们认为 fsync 才占磁 盘的 IOPS write 和 fsync 的时机,是由参数 sync_binlog 控制的: sync_binlog=0 的时候,表示每次提交事务都只 write,不 fsync; sync_binlog=1 的时候,表示每次提交事务都会执行 fsync;

MySQL的视图、事务和索引

陌路散爱 提交于 2020-02-27 05:02:56
视图 1. 为什么要有视图 对于复杂的查询,往往是有多个数据表进行关联查询而得到,如果数据库因为需求等原因发生了改变,为了保证查询出来的数据与之前相同,则需要在多个地方进行修改,维护起来非常麻烦 解决办法:定义视图 2. 视图是什么 通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。 视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变); 方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性; 3. 定义视图 建议以v_开头 create view 视图名称 as select语句; 4. 查看视图 查看表会将所有的视图也列出来 show tables; 5. 使用视图 视图的用途就是查询 select * from v_stu_score; 6. 删除视图 drop view 视图名称; 例: drop view v_stu_sco; 8. 视图的作用 提高了重用性,就像一个函数 对数据库重构,却不影响程序的运行 提高了安全性能,可以对不同的用户 让数据更加清晰 事务 1. 为什么要有事务 事务广泛的运用于订单系统、银行系统等多种场景 例如: A用户和B用户是银行的储户,现在A要给B转账500元,那么需要做以下几件事: 检查A的账户余额

MySQL——事务

蹲街弑〆低调 提交于 2020-02-27 03:02:11
事务处理可以用来维护数据库的完整性,它保证成批的MySQL操作要么全部执行,要么全部不执行。在使用事务和事务处理时,有几个关键词会反复出现 事务: 指一组SQL语句 回滚: 指撤销指定SQL语句的过程 提交: 将未存储的SQL语句结果写入数据库表 保留点: 事务处理过程中设置的临时占位符,可以对它发布回退 事务的四大特性 原子性: 事务中所有的操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败 一致性: 事务执行后,数据库状态与其业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的 隔离性: 并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰 持久性: 一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据 基本语法 //开启事务 START TRANSACTION; //提交事务 COMMIT; //回滚事务 ROLLBACK; ROLLBACk COMMIT 使用保留点 ps:本篇文章参考《MySQL必知必会》 来源: oschina 链接: https://my.oschina.net/u/4427158/blog/3165409

SQL进阶(1)——MySQL元数据与索引

混江龙づ霸主 提交于 2020-02-26 23:11:09
文章目录 1.mysql元数据 获取服务器元数据 2.mysql函数 2.1 常用的字符串函数 2.2 数字函数 2.3 日期函数 2.4 高级函数 3.MySQL索引 3.1 普通索引 3.1.1 创建索引 3.1.2 修改表结构(添加索引) 3.1.3 创建表的时候直接指定 3.1.3 删除索引的语法 3.2 唯一索引 3.2.1 创建索引 3.2.2 修改表结构 3.2.3 创建表的时候直接指定 3.3 使用ALTER 命令添加和删除索引 3.4 使用 ALTER 命令添加和删除主键 3.5 显示索引信息 4.MySQL 事务 4.1、事务控制语句: 4.2、MYSQL 事务处理主要有两种方法: 1.mysql元数据 你可能想知道MySQL以下三种信息: 查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数。 数据库和数据表的信息: 包含了数据库及数据表的结构信息。 MySQL服务器信息: 包含了数据库服务器的当前状态,版本号等。 在MySQL的命令提示符中,我们可以很容易的获取以上服务器信息。 获取服务器元数据 以下命令语句可以在 MySQL 的命令提示符使用,也可以在脚本中 使用,如PHP脚本。 命令 描述 SELECT VERSION( ) 服务器版本信息 SELECT DATABASE( ) 当前数据库名 (或者返回空) SELECT

IO诊断文档

不想你离开。 提交于 2020-02-26 09:00:08
利用 sys 库进行 IO 信息诊断 1、 table 相关 1.1 查询表的 IO 请求数量 mysql> select concat_ws('.',table_schema,table_name) 'table', io_read_requests, io_write_requests, io_misc_requests from sys.schema_table_statistics_with_buffer\G *************************** 1. row *************************** table: universe.u_delay # 表名 io_read_requests: 11 # 读请求数量 io_write_requests: 4 # 写请求数量 io_misc_requests: 15 # IO总请求数量 1.2 查询表的 IO 请求字节数 mysql> select concat_ws('.',table_schema,table_name) 'table', io_read, io_write from sys.schema_table_statistics_with_buffer\G *************************** 1. row ***************************