8事务
begin/start transaction命令并不是一个事务的起点,执行第一个操作InnoDB表的语句,事务才真正启动。
start transaction with consistent snapshot 命令立即启动事务,但没有创建readview
readview是执行sql语句时创建的。
写数据才会更新隐藏列DB_TRX_ID(最近操作此列的事务),数据库写是一致性的。
事务A | 事务B | 事务C |
---|---|---|
start transaction withconsistent snapshot; | ||
start transaction with consistentsnapshot; | ||
update t set k=k+1 where id=1: | ||
update t set k=k+1 where id=1:select k from t where id=1: | ||
select k from t whereid=1; | ||
commit; |
事务A:1
事务B:3
事务C:2
示例
sessionA | sessionB |
---|---|
begin;select * from t; | |
update t set c=c+1; | |
update t set c=0 where id=c;select * from t; |
sessionA修改会失败
一致性读和当前读
事务并发控制方式:MVCC和锁
在事务中读取数据时,基于事务开始时的快照(Snapshot)来获取数据,而不是读取最新的数据。
它确保了事务执行期间读取的数据是一致的,不受其他事务修改的影响。
一致性读(Consistent Read) | 当前读(Current Read) | |
---|---|---|
定义 | 在事务中读取数据时,基于事务开始时的快照(Snapshot)来获取数据,而不是读取最新的数据。确保了事务执行期间读取的数据是一致的,不受其他事务修改的影响 | 事务中读取数据时,直接读取最新的数据,而不是基于快照,用于需要获取最新数据的场景,例如 UPDATE、DELETE 或加锁的 SELECT |
实现方式 | 在 可重复读(REPEATABLE READ) 和 读已提交(READ COMMITTED) 隔离级别下,MySQL 使用 多版本并发控制(MVCC) 实现一致性读。事务开始时,MySQL 会创建一个快照,后续的 SELECT 查询都基于该快照读取数据。 | 当前读会加锁(如共享锁或排他锁),以确保读取的数据是最新的,常见的当前读操作包括:SELECT … FOR UPDATE、SELECT … LOCK IN SHARE MODE、UPDATE、DELETE |
特点 | 无锁:一致性读不会加锁,因此不会阻塞其他事务的写操作。快照数据:读取的是事务开始时的数据,而不是最新的数据。 | 加锁:当前读会加锁,可能会阻塞其他事务的写操作。读取的是最新的数据,而不是快照数据。 |
相关命令
查看事务信息(所有活跃的InnoDB)
select * from information_schema.innodb_trx\G
查找长时间运行的事务
SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query
FROM information_schema.innodb_trx
WHERE TIMESTAMPDIFF(SECOND, trx_started, NOW()) > 60; – 查找运行超过60秒的事务
查找处于锁等待状态的事务
SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query
FROM information_schema.innodb_trx
WHERE trx_state = ‘LOCK WAIT’;
查找特定线程的事务
SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query
FROM information_schema.innodb_trx
WHERE trx_mysql_thread_id =
查找持有最多锁的事务
SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query, trx_lock_structs
FROM information_schema.innodb_trx
ORDER BY trx_lock_structs DESC
LIMIT 10;
1 | trx_id varchar(18) 事务ID(唯一标识符)。 |