mysql事务

共享锁(读锁)和排他锁(写锁)

孤街浪徒 提交于 2019-12-04 08:40:08
转载: https://www.cnblogs.com/nickup/p/9804020.html 共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。 排他锁(X锁):用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。 如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。 我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突) 乐观锁 乐观锁不是数据库自带的,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。 通常实现是这样的:在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次,将那条记录的版本号加1。也就是先查询出那条记录,获取出version字段,如果要对那条记录进行操作(更新),则先判断此刻version的值是否与刚刚查询出来时的version的值相等,如果相等,则说明这段期间,没有其他程序对其进行操作

mysql事物锁等待超时,报错 Lock wait timeout exceeded; try restarting transaction

时间秒杀一切 提交于 2019-12-04 07:19:47
问题场景 问题出现环境: 1、在同一事务内先后对同一条数据进行插入和更新操作; 2、多台服务器操作同一数据库; 异常信息: _mysql_exceptions.OperationalError: (1205, 'Lock wait timeout exceeded; try restarting transaction') 原因分析 在高并发的情况下造成数据库死锁,后续操作超时抛出异常。 Mysql数据库采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。 解决方案 1、通过下面语句查找到为提交事务的数据,kill掉此线程即可。 select * from information_schema.innodb_trx 2、增加锁等待时间,即增大下面配置项参数值,单位为秒(s) innodb_lock_wait_timeout=500 3、优化存储过程,事务避免过长时间的等待。 扩展阅读: 在InnoDB Plugin之前,一般通过 show full processlist(很难发现被锁的行记录问题所在)和show engine innodb status 命令查看当前的数据库请求,然后再判断当前事务中锁的情况。随着mysql的发展,已经提供更加便捷的方法来监控数据库中的锁等待现象了。

脏读、幻读和不可重复读 + 事务隔离级别

拥有回忆 提交于 2019-12-04 07:15:45
1. 脏读 : 脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据 。 e.g. 1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务) 2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地! 3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000 像这样,Mary记取的工资数8000是一个脏数据。 2. 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样 在一个事务内两次读到的数据是不一样的,因此称为是不可重复读 。 e.g. 1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成 2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务. 3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000 解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。 3. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时

MySQL事务隔离级别

二次信任 提交于 2019-12-04 07:08:50
  事务有 ACID 四个基本属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)   数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。—— 维基百科 事务的概念看上去不难,但是需要注意以下几个点: 1、首先,事务就是要保证一组数据库操作,要么全部成功,要么全部失败; 2、在 MySQL 中,事务支持是在 引擎层 实现的; 3、并不是所有引擎都支持事务,如 MyISAM 就不支持,InnoDB 就支持; 今天,我们的主角是 隔离性 ,隔离性是指当多个用户并发操作数据库时,数据库为每一个用户开启不同的事务,这些事务之间相互不干扰,相互隔离。 脏读   脏读(dirty read),简单来说,就是一个事务在处理过程中读取了另外一个事务未提交的数据。这种未提交的数据我们称之为脏数据。依据脏数据所做的操作肯能是不正确的。 不可重复读   不可重复读(non-repeatable read), 是指一个事务范围内,多次查询某个数据,却得到不同的结果 。 在第一个事务中的两次读取数据之间,由于第二个事务的修改, 第一个事务两次读到的数据可能就是不一样的。   脏读和不可重复读的区别: 脏读 是某一事务 读取了 另外一个事务 未提交 的数据, 不可重复读

数据库

痴心易碎 提交于 2019-12-04 06:35:28
并发事务带来哪些问题? 在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。 脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。 丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。 不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。 幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务

mysql事务

允我心安 提交于 2019-12-04 06:29:54
mysql事务是数据库系统区别于其他文件系统的重要特性之一,事务是一组具有原子性sql的语句,或是一个独立工作的单元。 事务具有以下几点特性: 原子性,隔离性,可持久性,一致性 事务隔离性的四个级别 1、未提交读 2、已提交读,一个事务中可以读到其他事务已经提交的数据。 3、可重复读,就是一个事务中读到的数据不变。(innodb的默认设置) 4、串行化,就是事务一个个的执行 隔离级别又低到高,并发性由高到低 大事务 运行时间长,操作数据比较多的事务。大事务会锁定太多数据,造成大量超时和阻塞。对于大事务要分批操作数据,并且将不必要的查询操作移除事务。 mysql引擎,myisam,innodb myisam 不支持事务,表级锁 innodb事务级搜索引擎,完美支持行级锁,支持事务的acid特性。 来源: https://www.cnblogs.com/xiaofeiyang/p/11837637.html

用消息队列和消息应用状态表来消除分布式事务 (转)

↘锁芯ラ 提交于 2019-12-04 05:53:42
由于数据量的巨大,大部分Web应用都需要部署很多个数据库实例。这样,有些用户操作就可能需要去修改多个数据库实例中的数据。传统的解决方法是使用分布式事务保证数据的全局一致性,经典的方法是使用两阶段提交协议。 长期以来,分布式事务提供的优雅的全局ACID保证麻醉了应用开发者的心灵,很多人都不敢越雷池一步,想像没有分布式事务的世界会是怎样。如今就如MySQL和PostgreSQL这类面向低端用户的开源数据库都支持分布式事务了,开发者更是沉醉其中,不去考虑分布式事务是否给系统带来了伤害。 事实上,有所得必有所失,分布式事务提供的ACID保证是以损害系统的可用性、性能与可伸缩性为代价的。只有在参与分布式事务的各个数据库实例都能够正常工作的前提下,分布式事务才能够顺利完成,只要有一个工作不正常,整个事务就不能完成。这样,系统的可用性就相当于参加分布式事务的各实例的可用性之积,实例越多,可用性下降越明显。从性能和可伸缩性角度看,首先是事务的总持续时间通常是各实例操作时间之和,因为一个事务中的各个操作通常是顺序执行的,这样事务的响应时间就会增加很多;其次是一般Web应用的事务都不大,单机操作时间也就几毫秒甚至不到1毫秒,一但涉及到分布式事务,提交时节点间的网络通信往返过程也为毫秒级别,对事务响应时间的影响也不可忽视。由于事务持续时间延长,事务对相关资源的锁定时间也相应增加

MySQL性能测试调优

痞子三分冷 提交于 2019-12-04 05:45:21
MySQL性能测试调优 操作系统 基本操作 查看磁盘分区mount选项 $ mount 永久修改分区mount选项(系统重启后生效) 修改文件 /etc/fstab 中对应分区的mount options列的值 在线修改分区mount选项(系统重启后失效) $sudo -t ext4 -o remount,noatime,errors=remount-or / 文件系统优化 ext4文件系统优化 分区mount选项加noatime $sudo -t ext4 -o remount,noatime,errors=remo 注意:刚开始加了 nodelalloc 发现mysql写入不如去掉此参数(原因需分析)[参考:http://blog.tao.ma/?p=58] MySQL 基本操作 显示innodb引擎状态 mysql> show engine innodb status; 查看配置参数 mysql> show variables [like '']; 查看运行状态值 mysql> show global status [like '']; 修改配置参数方法 4.1. 修改配置文件(重启服务生效,适用于所有参数) 文件位置: /etc/my.cnf 4.2. 命令动态修改(重启服务失效,适用于动态参数) °mysql> set global [参数]=[值] 重启MySQL服务

Mysql --09 Innodb核心特性——事务

旧城冷巷雨未停 提交于 2019-12-04 04:56:16
目录 Innodb核心特性——事务 1.什么是事务 2.事务的通俗理解 3.事务ACID特性 4.事务流程举例 5.事务的控制语句 6.事务隐式提交情况 7.事务日志redo基本功能 8.redo数据实例恢复过程 9.事务日志undo 10.redo和undo的存储位置 11.事务中的锁 12.多版本并发控制(MVCC) 13.锁的粒度 14.事务的隔离级别 15.脏读 幻读 重复读 查询原因,和解决办法 (RR级别) Innodb核心特性——事务 1.什么是事务 主要针对DML语句(update,delete,insert) 一组数据操作执行步骤,这些步骤被视为一个工作单元: 1)用于对多个语句进行分组 2)可以在多个客户机并发访问同一个表中的数据时使用 所有步骤都成功或都失败 1)如果所有步骤正常,则执行 2)如果步骤出现错误或不完整,则取消 2.事务的通俗理解 伴随着“交易”出现的数据库概念。 我们理解的“交易”是什么? 1)物与物的交换(古代) 2)货币现金与实物的交换(现代1) 3)虚拟货币与实物的交换(现代2) 4)虚拟货币与虚拟实物交换(现代3) 数据库中的“交易”是什么? 1)事务又是如何保证“交易”的“和谐”? 2)ACID 3.事务ACID特性 Atomic(原子性) 所有语句作为一个单元,要么全部成功执行或全部取消。 Consistent(一致性)

mysql的undo log和redo log

心不动则不痛 提交于 2019-12-04 04:48:37
1.1 undo是什么 undo日志用于存放数据修改被修改前的值,假设修改 tba 表中 id=2的行数据,把Name='B1' 修改为Name = 'B2' ,那么undo日志就会用来存放Name='B'的记录,如果这个修改出现异常,可以使用undo日志来实现回滚操作,保证事务的一致性。 1.2 undo参数 MySQL跟undo有关的参数设置有这些: show global variables like '%undo%'; innodb_max_undo_log_size 控制最大undo tablespace文件的大小,当启动了innodb_undo_log_truncate 时,undo tablespace 超过innodb_max_undo_log_size 阀值时才会去尝试truncate。该值默认大小为1G,truncate后的大小默认为10M。 innodb_undo_tablespaces 设置undo独立表空间个数,范围为0-128, 默认为0,0表示表示不开启独立undo表空间 且 undo日志存储在ibdata文件中。该参数只能在最开始初始化MySQL实例的时候指定,如果实例已创建,这个参数是不能变动的,如果在数据库配置文 件 .cnf 中指定innodb_undo_tablespaces 的个数大于实例创建时的指定个数,则会启动失败,提示该参数设置有误。