数据库事务——快照读与当前读

简介: 数据库事务——快照读与当前读

数据库事务——快照读与当前读

文章目录

快照读与当前读

当前读

当前读:读取最新提交的数据

例如下面语句都会按最新提交的数据进行操作:

  • select … for update
  • select ... lock in share mode
  • insert、update、delete

当前读本质上是基于锁的并发读操作

快照读

快照读:读取某一个快照建立时(可以理解为某一时间点)的数据,也称为一致性读

快照读主要体现在 select 时,而不同隔离级别下,select 的行为不同

  • 在 Serializable (串行化)隔离级别下 - 普通 select 也变成当前读,即加共享读锁
  • 在 RC(读提交) 隔离级别下 - 每次 select 都会建立新的快照
  • 在 RR (可重复读)隔离级别下
  • 事务启动后,首次 select 会建立快照
  • 如果事务启动选择了 with consistent snapshot,事务启动时就建立快照
  • 基于旧数据的修改操作,会重新建立快照

所以快照读本质上读取的是历史数据(原理是回滚段),属于无锁查询。

RR下快照建立时机探究

1. 快照建立时机——第一次 select 时

tx1 tx2
set session transaction isolation level repeatable read;
start transaction;
select * from account; /* 此时建立快照,两个账户为 1000 */
update account set balance = 2000 where accountNo=1;
select * from account; /* 两个账户仍为 1000 */

这里的快照一旦建立,以后的查询都基于此快照,因此 tx1 中第二次 select 仍然得到 1 号账户余额为 1000

如果 tx2 的 update 先执行

tx1 tx2
set session transaction isolation level repeatable read;
start transaction;
update account set balance = 2000 where accountNo=1;
select * from account; /* 此时建立快照,1号余额已经为2000 */

2. 快照建立时机——事务启动时

如果希望事务启动时就建立快照,可以添加 with consistent snapshot 选项

tx1 tx2
set session transaction isolation level repeatable read;
start transaction with consistent snapshot; /* 此时建立快照,两个账户为 1000 */
update account set balance = 2000 where accountNo=1;
select * from account; /* 两个账户仍为 1000 */

这里添加了添加 with consistent snapshot 选项,快照就会在事务启动时建立,以后的查询都基于此快照,因此 tx1 中第二次 select 仍然得到 1 号账户余额为 1000

3. 快照建立时机——修改数据时

tx1 tx2
set session transaction isolation level repeatable read;
start transaction;
select * from account; /* 此时建立快照,两个账户为 1000 */
update account set balance=balance+1000 where accountNo=1;
update account set balance=balance+1000 where accountNo=1;
select * from account; /* 1号余额为3000 */

tx1 内的修改必须重新建立快照,否则,就会发生丢失更新的问题


相关文章
|
6月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
4月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
6月前
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
|
2月前
|
SQL 存储 Java
数据库———事务及bug的解决
事务的一些概念,并发事务以及并发事务引起的bug,脏读,不可重复读,幻读,数据库中的隔离级别,事务的简单应用
|
8月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
4月前
|
数据库
什么是数据库的事务隔离级别,有什么作用
【10月更文挑战第21】什么是数据库的事务隔离级别,有什么作用
43 3
|
4月前
|
存储 关系型数据库 数据挖掘
什么是数据库的事务隔离级别
【10月更文挑战第21】什么是数据库的事务隔离级别
61 1
|
4月前
|
存储 数据库 数据库管理
数据库事务安全性控制如何实现呢
【10月更文挑战第15天】数据库事务安全性控制如何实现呢
|
4月前
|
存储 数据库 数据库管理
什么是数据库事务安全性控制
【10月更文挑战第15天】什么是数据库事务安全性控制
|
4月前
|
供应链 数据库
数据库事务安全性控制有什么应用场景吗
【10月更文挑战第15天】数据库事务安全性控制有什么应用场景吗

热门文章

最新文章