如何在 ACID 事务中实现隔离?

问题描述 投票:0回答:1

我可以使用什么具体实现来隔离事务?例如,为了原子性,我可以将多个语句集中在 BEGIN TRAN 下,然后在某处调用 COMMIT。为了保持一致性,我可以设置列的类型以及约束。为了持久性,我可以设置触发器将记录存档到另一个表、安排备份作业或自己手动备份记录。我可以做些什么来隔离?锁定表是实现此目的的一种方法吗?我是否需要了解数据库“会话”是什么才能理解隔离?

sql transactions acid isolation
1个回答
0
投票

每个事务,不仅仅是显式事务(例如,BEGIN TRANSACTION 和 COMMIT/ROLLBACK 之间的事务)都与其他会话/用户隔离。

存储引擎会在其所能做到的最好的“表面”自动设置锁:

  • 模式:读取共享,写入独占
  • 粒度:行、页、分区、表/索引,取决于 交易使用的数据量
  • 类型:悲观或乐观
  • 持续时间:语句或交易取决于 使用的事务隔离级别

事务隔离级别可以有 4 个级别:

  • READ UNCOMMITTED :能够读取未提交的值(脏读, 混乱...-没有锁)
  • READ COMMITTED(悲观模式的普通级别):正在阅读 仅提交值(锁定持续时间是语句)
  • 重复读取:相同的数据集在以下情况下始终具有相同的值: 交易过程中阅读两次或以上。行上的锁是 维护到底(COMMIT/ROLLBACK)
  • SERIALIZABLE:表被锁定以确保没有更新或插入 在事务期间例如新行不会修改全局值 数据集

选择的隔离级别越高,并发数就越少。

您执行的任何修改结构或读取或写入数据的 SQL 命令,即使是 CREATE、ALTER、DROP、GRANT、REVOKE、EXECUTE... 等命令,默认情况下都是显式事务...

© www.soinside.com 2019 - 2024. All rights reserved.