-
2022-06-01 20:07:30
– 查看事务表
select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.innodb_trx;
字段说明
- trx_state:该事务的状态
- trx_started:该事物开始执行时间
- trx_mysql_thread_id:该事物对应的进程ID
- trx_query:该事务实行的sql
– 查看进程
show full processlist;
字段说明
- ID:进程ID
- DB:属于哪个库
- COMMAND:该进程的状态,比如Sleep、query、killed
- TIME:时间,该进程执行的时间,单位是秒
- STATE:该进程的状态,比如执行中或者等待
- INFO:执行的sql
更多相关内容 -
mysql事物
2021-01-19 12:53:38前言:通过本文你将了解到事物隔离级别带来的问题,innodb是怎么解决幻读,mysql事物特性,并配有案例说明。事务是一组访问并可能更新数据库内容的SQL组成的执行单元,是恢复和并发控制的基本单位。支持事物:Innodb...前言:通过本文你将了解到事物隔离级别带来的问题,innodb是怎么解决幻读,mysql事物特性,并配有案例说明。
事务是一组访问并可能更新数据库内容的SQL组成的执行单元,是恢复和并发控制的基本单位。
支持事物:Innodb、NDBCluster、TokuDB
不支持事物:Myisam、MEMORY/HEAP
事务具备4个基本属性:
Atomic,同一个事物里,要么都提交,要么都回滚。
Consistency,在事物开始之前和事物结束以后,数据库的完整性约束没有被破坏。
Isolation,并发事物间的数据是彼此隔离的
Durabiliy,事物提交后,所有结果必须持久化
在mysql中怎样开始或回滚一个事务呢?
1、显示开始,START TRANSACTION WITH CONSISTENT SNAPSHOT; BEGIN;
2、隐士开始,BEGIN / START TRANSACTION / SET AUTOCOMMIT = 1 / 其他非事务语句(DDL/DCL)会导致之前没提交的事务提交。
3、显示回滚,ROLLBACK
4、隐士回滚,连接断开 / 超时
在修改事务隔离级别时需要注意set global xxx;这时只针对新连接生效,当前连接不生效(如果有连接池的话就麻烦了,连接池都是长连接)
mysql> set global transaction isolation level read committed;
Query OK,0 rows affected (0.00sec)
mysql> show session variables like"tx_isolation";+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)
在修改事物隔离级别时不加global和session,下一个事物才开始生效。set session xxx;直接生效。(mysql中默认是RR隔离级别)
如果没有事物控制的话,那么并发读写数据库会有什么隐患?
脏读:一个事物按相同的查询条件读取以前检索过的数据,却发现其他事物更新后达到了满足其查询条件的旧数据(此时它还未提交),这种现象称为“脏读”
不可重复读:一个事物按相同的查询条件读取以前检索过的数据,却发现其他事物更新后达到了满足其查询条件的旧数据(此时它已被提交),这种现象称为“不可重复读”
幻读:一个事物按相同的查询条件读取以前检索过的数据,却发现其他事物插入了满足其查询条件的新数据(此时它已被提交),这种现象称为“幻读”
脏读,在一个事物里面读取到其他事物未提交的数据:
不可重复读,在一个事物里面读取到其他事物已经提交的修改的数据:
幻读,在一个事物里面读取到其他事物已经提交的新增的数据:
mysql的4种隔离级别:
1. read uncommitted隔离级别最低,允许脏读,允许事物查看其它事物所进行的未提交更改
2.read committed允许幻读,允许事物查看其它事物所进行的已提交更改
3.repeatable read消除了脏读、不可重复读、幻读保证了事物一致性(innodb特定条件下可能发生幻读,后面会讲到)
4.serializable串行化读,每次读都需要获得表级别共享锁,读写间互相都会阻塞
例如有t1表:
mysql> show create tablet1\G*************************** 1. row ***************************
Table: t1Create Table: CREATE TABLE`t1` (
`c1`int(11) NOT NULL,
`c2`int(11) DEFAULT NULL,
`c3`int(11) DEFAULT NULL,PRIMARY KEY(`c1`),KEY`c2` (`c2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00sec)
mysql> select * fromt1;+----+------+------+
| c1 | c2 | c3 |
+----+------+------+
| 0 | 0 | 0 |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
+----+------+------+
4 rows in set (0.00 sec)
读未提交,read uncommitted,RU
读已提交,read committed,RC
RC下的幻读:(此处加for update 表示即便是 RC隔离级别,但是可以读取当前数据的最新版本)
可重复读,repeatable read,RR
在RR隔离级别下,没有幻读。
innodb在RR级别下引入了gap lock来解决幻读,例如:select * from t1 where c2 =2 for update;这样会将索引记录上面1-3(不包括1和3)这个范围的gap全锁定来避免幻读:
加for update 两个作用1:表明要读这行数据的当前最新数据,2:把这行数据加上排它锁。
串行,serializable
可通过innodb_lock_waits查看发生锁等待信息:
mysql> select * frominformation_schema.innodb_lock_waits;+-------------------+------------------------+-----------------+------------------+
| requesting_trx_id | requested_lock_id | blocking_trx_id | blocking_lock_id |
+-------------------+------------------------+-----------------+------------------+
| 421424334461664 | 421424334461664:31:3:4 | 4910 | 4910:31:3:4 |
+-------------------+------------------------+-----------------+------------------+
1 row in set, 1 warning (0.00 sec)
最后我们再说下 InnoDB semi-consitent read,innodb的半一致性读,在innodb特殊实现的机制,主要目的是提升并发效率。update语句如果读到一行已经加锁的记录,此时InnoDB返回该记录最新版本,再次判断此版本是否满足update的where条件。若满足(需要更新),则MySQL会重新发起一次读操作,此时会读取行的最新版本(并加锁) #这种情况只发生在RC或 RR+innodb_locks_susafe_for_binlog=1环境下,所以说RR+innodb_locks_susafe_for_binlog=1时存在幻读可能。
可以这样理解:假设这个表有10万行数据,对一个表进行更新,没有索引,正常情况下会把所有数据全部锁定,但是另一个会话想要对这个表update 更新,这个update 可能只影响两行数据,这时候这个update可以被执行,不受全表锁限制,仅仅只针对update生效,其他SQL不会生效。
-
MySQL事物实现原理之组提交(group commit).pdf
2021-03-26 16:43:46MySQL事物实现原理之组提交(group commit).pdf -
mysql事物处理
2021-01-19 13:57:49mysql事物主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等。这样,这些数据库操作语句就构成一个事物。...mysql事物主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等。这样,这些数据库操作语句就构成一个事物。注意一下几点:
在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务。
事物处理可以用来维护数据库的完整性,保证成批的sql语句要么全部执行,要么全部不执行。
事物用来管理insert,update,delete语句。
先简单介绍一下事物吧。事物是DBMS的执行单位。它由有限的数据库操作序列组成的,但不是任意的数据库操作序列都能成为事物。一般来说,事物必须满足4个条件(ACID):
原子性:组成事物处理的语句形成了一个逻辑单元,不能只执行其中一部分。换句话说,事物是不可分割的最小单元。比如银行转账过程中,必须同时从一个账户减去转账金额,并加到另一个账户中,只改变一个账户是不合理的。
一致性:在事物处理执行前后,mysql数据库是一致的。也就是说,事物应该正确的转换系统状态。比如银行转账过程中,要么转账金额从一个账户到另一个账户,要么两个账户都不变,没有其他情况。
隔离性:一个事物处理对另外一个事物处理没有影响。比如说银行转账过程中,在转账事物没有提交之前,另一个转账事物只能处于等待状态 。
可靠性:事物处理的效果能够被永久保存下来。反过来说,事物能够承受所有的失败。包括服务器,进程,通信以及媒体失败等等。比如银行转账过程中,转账后账户的状态要能被保存下来。
mysql的事物处理主要有两种方法:
1. begin,rollback,commit来实现
begin 开始一个事物
rollback 事物回滚
commit 事物确认,事物提交
2,直接用set来改变mysql的自动提交模式
mysql默认z是自动提交的,也就是你提交一个query,它就直接执行。
set autocommit = 0 禁止自动提交模式
set autocommit = 1 开启自动提交模式
mysql中只用INNODB和BDB类型的数据表才能支持事物处理(切记)!
来看一个例子:
先假设一下问题的背景:网上购书,某书《mysql数据库》编号为123,只剩最后一本,而这个时候两个用户几乎同时对这本书发出了购书请求,让我们来看看整个过程:
在具体分析之前,先来看看数据表的定义:
对于用户甲来说,他的动作稍微比乙快一点点,其购买过程中所触发的动作大致是这样的:
1.select book_number from book where book_id = 123;
book_number 大于0,确认购买行为并更新book_number
2.update book set book_number = book_number—1 where book_id = 123;
购书成功
表面上看甲乙的操作都成功了,他们都买到了书,但是库存只有一本,他们怎么可能都成功呢?再看看数据表里book_number的内容,已经变成“-1”了,这当然是不能允许的(实际上,声明这样的列类型应该加上unsigned的属性,以保证其不能为负,这里是为了说明问题所以没有这样设置)
好了,问题陈述清楚了,再来看看怎么利用事务来解决这个问题,打开MySQL手册,可以看到想用事务来保护你的SQL正确执行其实很简单,基本就是三个语句:开始,提交,回滚。
开始:START TRANSACTION或BEGIN语句可以开始一项新的事务
提交:COMMIT可以提交当前事务,是变更成为永久变更
回滚:ROLLBACK可以回滚当前事务,取消其变更
此外,SET AUTOCOMMIT = {0 | 1}可以禁用或启用默认的autocommit模式,用于当前连接。
那是不是只要用事务语句包一下我们的SQL语句就能保证正确了呢?比如下面代码:
答案是否定了,这样依然不能避免问题的发生,如果想避免这样的情况,实际应该如下:
由于加入了FOR UPDATE,所以会在此条记录上加上一个行锁,如果此事务没有完全结束,那么其他的事务在使用SELECT ... FOR UPDATE请求的时候就会处于等待状态,直到上一个事务结束,它才能继续,从而避免了问题的发生,需要注意的是,如果你其他的事务使用的是不带FOR UPDATE的SELECT语句,将得不到这种保护。
-
mysql 事物
2017-10-16 11:32:50什么是mysql事物?mysql的事物是指的是吧数据库数据从一种一致性的状态转化为另外一种一致性状态。 不会出现中间状态,这也是数据库区别于文件系统的一个重要的标志。事物的特性?数据库的事物有ACID的特性: 原子...什么是mysql事物?
mysql的事物是指的是吧数据库数据从一种一致性的状态转化为另外一种一致性状态。 不会出现中间状态,这也是数据库区别于文件系统的一个重要的标志。
事物的特性?
数据库的事物有ACID的特性:
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)原子性:事物中的数据修改,要么是全部成功,要么是全部失败,不会出现一个事物中的部分数据修改成功,部分失败的情况。
一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
隔离性:事物的隔离性,指的是不同事物之间是相互隔离的,一个事物不能被干扰,并行事物要相互隔离。
持久性:指的是事物所做的修改,是持久的,即使遇到数据库故障,也不会丢失事物提交的操作。事务分类
扁平事务(Flat Transactions)
带有保存点的扁平事务(Flat Transactions with Savepoints)
链事务(Chained Transactions)
嵌套事务(Nested Transactions)
分布式事务(Distributed Transactions)扁平事务:扁平事务 是事务类型中最简单的一种,但是在实际生产环境中,这可能是使用最频繁的事务,在扁平事务中,所有操作都处于同一层次,其由BEGIN WORK开始,由COMMIT WORK或ROLLBACK WORK结束,其间的操作是源自的,要么都执行,要么都回滚,因此扁平事务是应用程序称为原子操作的的基本组成模块。
带有保存点的扁平事务 除了支持扁平事务支持的操作外,允许在事务执行过程中回滚同一事务中较早的一个状态。这是因为某些事务可能在执行过程中出现的错误并不会导致所有的操作都无效,放弃整个事务不合乎要求,开销太大,保存点用来通知事务系统应该记住事务当前的状态,以便当之后发生错误时,事务能回到保存点当时的状态对于扁平的事务来说,隐式的设置了一个保存点。然而整个事务中,只有这一个保存点,因此,回滚只能会滚到事务开始时的状态,保存点用SAVE WORK函数来建立,通知系统记录当前的处理状态。当出现问题时,保存点能用作内部的重启动点,根据应用逻辑,决定是回到最近一个保存点还是其他更早的保存点。
链事务 可视为保存点模式的一种变种,带有保存点的扁平事务,当发生系统崩溃是,所有的的保存点都将消失,因为其保存点是易失的,这意味着当进行恢复时,事务需要从开始处重新执行,而不能从最近的一个保存点继续执行
链事务的思想是:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务,提交事务操作和开始下一个事务操作 将合并为一个原子操作,这意味着下一个事务将看到上一个事务的结果,就好像一个事务中进行的一样,如图显示了链事务的工作方式
链事务与带有保存点的扁平事务不同的是,带有保存点的扁平事务能回滚到任意正确的保存点,而链事务中的回滚仅限当前事务,即只能恢复到最近的一个保存点,对于锁的处理,两者也不相同,锁事务在执行COMMIT后即释放了当前所持有的锁,而带有保存点的扁平事务不影响迄今为止所持有的锁嵌套事务 是一个层次结构框架,由一个顶层事务(top-level transaction)控制着各个层次的事务,顶层事务之下嵌套的事务被称为子事务,其控制每一个局部的变换
分布式事务
通常是一个分布式环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点假如一个用户在ATM机上进行银行的转账操作,例如持卡人从招商银行存储卡转账10 000 元到工商银行的存储卡。这种情况下,可以将ATM机视为节点A,招商银行的后台数据库视为节点B,工商银行的后台数据库视为C,这个转账的操作可分解为以下的步骤
节点A发出转账命令
节点B执行存储卡中的余额减去10 000
节点C执行存储卡终端的余额增加10 000
节点A通知用户操作完成或者节点A通知用户操作失败
这里需要使用到分布式事务,因为节点A不能通过一台数据库就完成任务,其需要访问网络中两个节点的数据库,而在每个节点的数据库执行的实务操作有都是扁平的,对于分布式事务,其同样需要满足ACID特性,要么都发生,要么都失败。对于上述例子,如果2 3 步中任何一个操作失败,都会导致整个分布式事务回滚,若非这样,结果非常可怕
对于InnoDB存储引擎来说,其支持扁平事务,带保存点的事务,链事务,分布式事务。对于嵌套事务,其原生不支持。因此对有并发事务需求的用户来说,MySQL数据库或InnoDB存储引擎就显得无能为力,然而用户仍可以通过带保存点的事务来模拟串行的嵌套事务
事物的隔离级别:
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SEARIALIZABLERead Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。不好的使用事物的习惯:
在循环中提交
使用自动提交
使用自动回滚
长事务 -
mysql事物长时间未提交引起的Lock wait timeout
2020-12-21 18:04:50查询到有个事物一直运行时间长达15分钟未提交,导致后续的线程等待超时,解决方法就是kill trx_mysql_thread_id,功能回复正常。 后续思考: 引发一个问题,假如事物一直未手动释放,后续功能不是一直受影响,mysq -
mysql 事物处理
2017-08-15 13:11:08/*** * 事物处理应用set autocommin=0禁止自动...开启自动提交,MySQL默认自动提交 *1,开启事物后set autocommin=0,commit/rollback同时执行一个事物才会有效 * 否则无效 * 2,开启事物后如果不进行commit/rollback,执 -
mysql 事物浅析
2021-02-03 11:15:27我的理解:上面的这段话是《mysql技术内幕》对事物所下的定义。好高大上的样子,似乎不怎么看得懂!个人的观点是事物是一种机制,这种机制能够保证在一组的sql语句要么都成功执行、要么都不执行!事物这么好,是否都... -
mysql 事物没提交导致事物一直运行解决方案
2018-09-30 16:36:001、设置 innodb_kill_idle_transaction 参数, 可以永久避免 https://dbaplus.cn/news-11-974-1.html 转载于:https://www.cnblogs.com/graph/p/9732427.html -
MySQL事物和事物回滚
2018-08-18 20:07:44什么是事物? 事物说白了就是一件事从开始发生到结束的整个过程。在MySQL里事务是一组不可被分割执行的SQL语句集合,如果有必要,可以撤销。 这样可以确保数据的一致性。rollback事物回滚,则事物执行失败,保证了... -
详解mysql事物隔离级别与锁机制
2019-01-21 17:34:34事物隔离级别 首先看下数据库事物四大特性,...mysql具有四种事物隔离级别,隔离力度依次递增,高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。不同业务场景下使用不同的数据... -
MYSQL事物sql 简单事例
2018-09-17 17:36:07drop table if exists `runoob_transaction_test`; CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb; # 创建数据表 select * from runoob_transaction_test; begin; # 开始事务 ... -
MySQL:事物ACID特性
2022-04-11 14:43:14MySQL事物的ACID特性:原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability) -
查询MySQL进行中的事物
2022-04-24 09:57:36查询进行中的事物 select * from information_schema.innodb_trx\G; 结果: *************************** 1. row *************************** trx_id: 825467 trx_state: RUNNING trx_started: 2022-04-24 01:... -
12.关于mysql事物。
2021-02-02 13:13:04一、什么是事物?个人理解,sql中的事物就是给sql语句做一个分组,组内的sql语句要不然就全部执行成功,要不然就完全的不会执。或者说作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。... -
Mysql事物隔离级别之 READ COMMITTED & REPEATABLE READ
2021-03-23 19:08:12SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是: 读未提交(READ UNCOMMITTED) 读提交 (READ COMMITTED) 可重复读 (REPEATABLE READ) 串行化 (SERIALIZABLE) 本文只讲READ ... -
MySQL事物隔离级别
2022-03-24 16:22:36MySQL事物隔离级别事物基本要素概念说明事物隔离级别读未提交读提交可重复读串行化 事物基本要素 原子性:事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到... -
mysql 事物四大特性和事物的四个隔离
2021-01-19 13:40:201、事物四大特性(ACID)原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的... -
Mysql事物和索引
2018-08-12 09:37:47Mysql事物具有以下特点: 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。 事务用来管理 insert,... -
mysql事物写入过程原理
2019-08-04 13:19:56(mysql进程宕机不影响) 二、双写磁盘,保证高可用 写入磁盘时,进行双写,避免一个文件损坏,可从另一个文件恢复,保证高可用。 同时写入共享表空间(所有表都往同一个文件顺序写)和数据表空间... -
Mysql事物锁等待超时 Lock wait timeout exceeded; try restarting transaction
2021-07-28 09:53:21Mysql数据库采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。 解决方案 1、通过下面语句查找到为提交事务的数据,kill掉此线程即可。 select * from ... -
MySQL事物的隔离级别
2019-01-20 21:37:06事物 原子性、一致性、隔离性(未提交读、已提交读、可重复读、可串行化)、持久性 隔离级别 MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”(REPEATABLE READ) 1) 未提交读(READ UNCOMMITTED) 另一个... -
Mysql事物commit之后无法回滚,未commit可以回滚
2019-03-29 08:46:50start TRANSACTION; delete from article where aid= 3; COMMIT; ROLLBACK; -- 此时回滚无效 ----------------------------------------------- start TRANSACTION; delete from article where aid= 3;... -- ... -
mysql事物隔离级别以及出现的问题总结
2019-08-27 23:52:52mysql默认事物自动提交 show variables like "autocommit"; 查看显示 autocommit 为 on 如果我们手动开启一个事物,那 autocommit(自动提交)失效,必须手动 commit之后修改的数据才会生效 即: begin; 事物上... -
java 使用mysql事物处理问题
2014-08-07 23:15:52在以前mysql中是不支持事物的,后来添加的InnoDB -
MySQL事务原理
2022-03-26 20:36:02实际上,我们研究事务的原理,就是研究MySQL的InnoDB引擎是如何保证事务的四大特性的。 而对于这四大特性,实际上分为两个部分。 其中的原子性、一致性、持久化,实际上是由InnoDB中的两份日志来保证的,一份是... -
mysql事物隔离的问题,求大神指教
2015-12-20 12:05:30我对mysql事物隔离性一向是一知半解,这次还是下决心做了一个测试,不过测试的结果无法解释 求大神指教: 主函数如下: public static void main(String args[]) { // 初始化数据库 String dev = ... -
mySQL 事物提交成功不等于数据保存成功
2018-03-23 13:54:16我只能说这是公司没有DBA,或者说大家不能深层次理解mySQL原理的悲哀! 针对此,特意写了这篇博客!(理解不深刻不准确之处,敬请指出)现象 正常情况下,我们会将一系列增,删,改操作写在一个事物中,也就是一个... -
Mysql事务
2021-03-18 00:55:50七、事物的作用范围 事务隔离级别作用范围有2种: 全局级别(global):对所有会话有效 会话级别(session):只对当前会话有效 八、设置事务隔离级别 SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL GLOBAL:代表...