Web开发人员编程模型:隔离级别
ACID性质是数据库理论中的奠基石,它定义了一个理论上可靠数据库所必须具备的四个性质:原子性,一致性,隔离性和持久性。虽然这四个性质都很重要,但是隔离性最为灵活。大部分数据库都提供了一些可供选择的隔离级别,且现在许多库都增加了附加层来创建颗粒度更细的隔离。隔离级别应用范围如此之广主要是因为放宽隔离约束往往会使得可扩展性和性能提高几个数量级。
串行一致性是可用的最古老最高的隔离级别之一,它之所以倍受青睐是因为其提供的简单编程模型,即每次仅能有一个事务对给定的资源进行操作,这就避免了很多潜在的资源问题。尽管如此,大部分应用程序(尤其是Web应用程序)都不采用这种级别非常高的隔离,因为从终端用户的角度来看这是不切实际的-任何一个拥有大量用户群的应用程序在访问共享资源时都将会有几分钟的延迟,而这会使得用户量迅速减少。弱一致性和最终一致性在大规模分布式数据源中,例如Web中,随处可见。好几个成功的大型Web应用(例如,eBay和Amazon)都显示出乐观的(optimistic)弱一致性要比传统悲观的(pessimistic)机制在扩展性方面好得多。本文将一窥八种不同的隔离级别。学会适当的放宽数据一致性的约束,你可以在自己的应用程序中使用这八种隔离级别来获得更好的性能和可扩展性。
并发控制的主要目标是为了确保事务被隔离且不会影响到其他事务。要达到高级别的隔离需以牺牲性能为代价。并发控制可以用悲观或者乐观的机制来实现。大部分关系型数据库都使用了悲观机制来实现写入优化。悲观机制采用了锁,通过使用锁它可以阻塞一些操作或者进行某些形式的冲突检测。当一个表格,页面或是行被修改后,悲观机制中的锁可以用来阻塞其他潜在的访问修改资源的事务。然而,乐观机制并不采用任何锁,它仅仅依赖于冲突检测来维护事务隔离。乐观机制采用的冲突检测可以允许所有的读操作,并在事务结束时检验其一致性。如果检测到冲突,那么事务会进行回滚或重做。大部分web服务器都是读入优化,因此使用了乐观机制。通过允许所有的读入操作,乐观机制既可以保证很高的读写吞吐量,也可以在资源不是一直改变的情况下保证数据的一致性。
下面列出的隔离级别是用来帮助Web开发人员更好的理解他们编程模型中放置的约束,帮助系统架构师和开发人员共同讨论如何在保持必要的数据完整性的同时选择最有效的隔离级别。它们按照最少隔离(未提交读)到最多隔离(串行化)的顺序列出。
1、未提交读(Read Uncommitted)
未提交读隔离级别需要事务间很少的隔离。每一个读操作都能看到事务中等待的写操作(脏读)。然而已经提交的写操作必须要有一个串行顺序来防止脏写。悲观机制会阻塞有冲突的写操作直到其他写操作已经被提交或已经回滚。乐观机制不会锁住这些操作,它会允许所有的操作都通过。如果一个连接进行了回滚,那么接下来修改同一块数据的其他操作也会被回滚。在这种级别中,共享缓冲可以不加验证的进行使用。这种隔离级别最好在不需要事务(比如只读的数据集),或者事务只在独占数据库时才修改的情况下使用。
例子:一个只在离线情况下更新的档案数据库,或者不在事务中使用的审核/登陆(audit/logging)表。
2、已提交读(Read Committed)
已提交读可以读取系统中任何已经提交的状态,并且可以不加验证(混合状态)的进行缓冲,只需当前连接中发生的改变能够反映到结果中即可。悲观机制将其实现为单调视图。乐观事务则隔离存储所有的改动,使得它们直到提交后才可用。读已提交使用一个非常乐观的机制,它推迟写入所有的变化直到事务被提交为止。这种形式的乐观隔离可以在不阻塞读操作的情况下实现复杂的写入操作,并且它没有验证模式。共享缓冲只能在已提交的状态中使用。这种隔离级别最好在结果可以使用旧值,且事务只能用于写入操作的情况下使用。
例子:一个不必显示当前最新帖子的在线论坛,且它的帖子间数据不相冲突。
3、单调视图(Monotonic View )
单调视图是对读已提交的一个扩展,它其中的事务在执行时会观察数据库中一个单调上升的状态。在这种级别中,如果有明显的写入事务,那么悲观事务会在读入操作中被阻塞。乐观事务会像在读已提交中一样操作,隔离保存所有的改动,并且会验证它们的缓冲以确保其仍然合法。这种级别可以定期地同步数据库副本,且最好在不需要事务或者仅存在写操作事务的情况下使用。
例子:一个仅能由一个人来修改的用户偏好表。
4、快照读取(Snapshot Reads)
快照读取扩展了单调视图,它可以保证查询结果都能反映到数据库一致的快照中。悲观机制会在读操作时阻碍其他影响结果的写入操作。乐观机制则允许其他的写入操作,并通知读取事务某部分已经发生改变并进行回滚。想要实现一个乐观机制,必须在读操作结束之前验证是否有什么并行的写入操作修改了结果,如果有的话,那么结果可能会重做或回滚。这个检验过程可能只是简单的检查同一张表中是否出现了写入操作,或者只是检查改动的查询结果。乐观隔离级别可以很轻松地检测出冲突,并且在允许并发读入操作的过程中,支持写入操作。这种级别只要能够读取到快照,便可以定期地同步数据库副本。最好在写入操作很少,不想与读入操作冲突,且查询结果需要一致性的时候使用这种隔离级别。
例子::一个查询比修改频繁,且只保留最新值的货币换位表或者查询表。
5、游标稳定性(Cursor Stability)
游标稳定性隔离扩展了读已提交,并且是许多关系型数据默认的隔离级别。在这种隔离级别中,悲观事务如果在一个单独的语句中执行的话,必须得指定它将修改的记录。这通常可以在"SELECT"查询后附加“FOR UPDATE”关键字来实现。在这种情况下,其他冲突的读写悲观事务都将被阻塞直到该事务结束为止。乐观事务会跟踪提交时被验证的所有修改记录/实体的版本号。这是一种很流行的乐观隔离级别,因此被所有的主流对象关系映射库支持。在Java持久性API中,可以使用FLUSH_ON_COMMIT(尽管查询可能不影响本地改动)来接近达到这种级别,且如果检测到冲突的话,可以抛出OptimisticLockException 异常。这种隔离也同样可以用在HTTP头域的If-Match或者 If-Unmodified-Since中,它可以用来在更新前对比上一个资源的版本或者时间戳。这种级别最好在实体由外部信息(不从数据库中读取)更改,或者改动不会彼此覆盖的情况下使用。
例子:一个共享的公司目录或者一个wiki。
6、可重复读取(Repeatable Read)
可重复读取级别扩展了游标稳定性,它保证事务内的任何数据在事务过程中都不会被修改或者移除。悲观事务需要读取所有记录上的锁,并阻塞其他服务来修改这些记录。乐观事务则会跟踪所有的记录或者实体,并检查它们是否在提交时被修改过。这种级别最好在实体状态能够影响其他实体,或者事务由读写操作构成的情况下使用。
例子:一个订单跟踪数据库,它从一个实体中读取值并用它来计算其他的实体值。
7、快照隔离(Snapshot Isolation)
快照隔离扩展了快照读取和可重复读取,它保证事务中所有进行的读操作都能看到数据库中一致的快照。事务执行的的任何读操作都会有相同的结果,而不管它们在事务中执行的早晚。这和可重复读取不同,因为快照隔离能够防止幻读(查询结果不断变化)。许多关系型数据库采用多版本并发控制(也可以叫做 SERIALIZABLE)来支持这种级别,实现方法是通过锁和冲突检测的组合。在这种级别中,考虑到它可能与悲观机制或者乐观机制相冲突,因此事务一定要做好回滚的准备。悲观机制会通过锁住资源来尝试减少冲突的机会,但是必须在事务提交后将这些改动合并。乐观机制也会使用多版本并发控制,但是它不会阻塞其他可能产生潜在冲突操作的事务,反而是将冲突的事务进行回滚。这种级别的隔离最好在事务可以读取和修改多个记录的情况下使用。
例子:一个基于系统状态规则的工作流系统。
8、可串行性(Serializability)
串行性是快照隔离的扩展,它要求所有的事务都必须一个接着一个的出现,就好比它们被串行化过一样。悲观机制需要锁住所有评估过的查询,以防止写入操作影响这些结果。而乐观机制则跟踪所有评估过的查询,并在事务结束时使用一个后向验证或前向验证的模式来检查是否有并行写入操作影响了并行读入操作,如果有的话,它会将冲突事务外的所有事务进行回滚。在这种隔离级别中,任何提交事务都不会改变系统的表征状态。最好在需要完整数据一致性的情况下使用这个级别的隔离。
例子:一个进行范围查询来计算新值的账目系统。
总结
下面是本文提到的隔离级别的汇总表,它可以帮助你找到最适合你应用程序的级别。
事务在不同隔离级别中可能的冲突类型:
脏写 | 脏读 | 混合状态 | 不一致读 | 覆写 | 不可重复 | 幻读 | 不一致性 | |
未提交读 | 不可以 | 可以 | 可以 | 可以 | 可以 | 可以 | 可以 | 可以 |
已提交读 | 不可以 | 不可以 | 可以 | 可以 | 可以 | 可以 | 可以 | 可以 |
单调视图 | 不可以 | 不可以 | 不可以 | 可以 | 可以 | 可以 | 可以 | 可以 |
快照读取 | 不可以 | 不可以 | 不可以 | 不可以d | 可以 | 可以 | 可以 | 可以 |
游标稳定性 | 不可以 | 不可以 | 可以 | 可以 | 不可以 | 可以 | 可以 | 可以 |
可重复读取 | 不可以 | 不可以 | 可以 | 可以 | 不可以 | 不可以 | 可以 | 可以 |
快照隔离 | 不可以 | 不可以 | 不可以 | 不可以 | 不可以 | 不可以 | 不可以 | 可以 |
可串行性 | 不可以 | 不可以 | 不可以 | 不可以 | 不可以 | 不可以 | 不可以 | 不可以 |
不同隔离级别的最佳前提:
缓冲 | 数据同步 | 乐观冲突模式 | 建议操作 | 例子 | |
未提交读 | 允许缓冲 | 间歇的 | 检测脏写 | 不能并发读写 | 档案 |
已提交读 | 允许缓冲 | 间歇的 | 没有冲突检测 | 单调的读/写 | Web论坛 |
单调视图 | 必须被验证 | 周期的 | 没有冲突检测 | 组合读入 | 用户偏好 |
快照读取 | 必须被验证 | 周期的 | 对比读入与修改内容 | 一致性读入 | 查询表 |
游标稳定性 | 允许缓冲 | 间歇的 | 对比修改的实体版本 | CRUD服务 | 目录 |
可重复读取 | 允许缓冲 | 间歇的 | 对比读入的实体版本 | 读/写实体 | 订单跟踪 |
快照隔离 | 必须被验证 | 周期的 | 对比读入的实体版本 | 同步实体 | 工作流 |
可串行性 | 必须被验证 | 完整同步 | 对比查询与修改内容 | 完善数据一致性 | 账目 |
数据一致性在数据库应用程序中至关重要-它允许开发者在分布式环境下使用数据。尽管强一致性级别如可串行性提供了一个简单的编程模型,但是它们会导致开销 过大,操作阻塞或者事务回滚,这对于很多应用程序来说都是不必要的。如果有其他问题的话,可以使用更加适当的隔离级别来帮助开发人员和系统架构师,让他们 在保持性能和开销平衡的前提下更好的理解数据一致性的需求。
查看英文原文:Eight Isolation Levels Every Web Developer Should Know。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

로그인 화면에 "귀하의 조직에서 PIN 변경을 요구합니다"라는 메시지가 나타납니다. 이는 개인 장치를 제어할 수 있는 조직 기반 계정 설정을 사용하는 컴퓨터에서 PIN 만료 제한에 도달한 경우 발생합니다. 그러나 개인 계정을 사용하여 Windows를 설정하는 경우 이상적으로는 오류 메시지가 나타나지 않습니다. 항상 그런 것은 아니지만. 오류가 발생한 대부분의 사용자는 개인 계정을 사용하여 신고합니다. 조직에서 Windows 11에서 PIN을 변경하도록 요청하는 이유는 무엇입니까? 귀하의 계정이 조직과 연결되어 있을 수 있으므로 이를 확인하는 것이 기본 접근 방식입니다. 도메인 관리자에게 문의하면 도움이 될 수 있습니다! 또한 잘못 구성된 로컬 정책 설정이나 잘못된 레지스트리 키로 인해 오류가 발생할 수 있습니다. 지금 바로

Windows 11은 신선하고 우아한 디자인을 전면에 내세웠습니다. 현대적인 인터페이스를 통해 창 테두리와 같은 미세한 세부 사항을 개인화하고 변경할 수 있습니다. 이 가이드에서는 Windows 운영 체제에서 자신의 스타일을 반영하는 환경을 만드는 데 도움이 되는 단계별 지침을 설명합니다. 창 테두리 설정을 변경하는 방법은 무엇입니까? +를 눌러 설정 앱을 엽니다. Windows개인 설정으로 이동하여 색상 설정을 클릭합니다. 색상 변경 창 테두리 설정 창 11" Width="643" Height="500" > 제목 표시줄 및 창 테두리에 강조 색상 표시 옵션을 찾아 옆에 있는 스위치를 토글합니다. 시작 메뉴 및 작업 표시줄에 강조 색상을 표시하려면 시작 메뉴와 작업 표시줄에 테마 색상을 표시하려면 시작 메뉴와 작업 표시줄에 테마 표시를 켭니다.

기본적으로 Windows 11의 제목 표시줄 색상은 선택한 어두운/밝은 테마에 따라 다릅니다. 그러나 원하는 색상으로 변경할 수 있습니다. 이 가이드에서는 이를 변경하고 데스크톱 환경을 개인화하여 시각적으로 매력적으로 만드는 세 가지 방법에 대한 단계별 지침을 논의합니다. 활성 창과 비활성 창의 제목 표시줄 색상을 변경할 수 있습니까? 예, 설정 앱을 사용하여 활성 창의 제목 표시줄 색상을 변경하거나 레지스트리 편집기를 사용하여 비활성 창의 제목 표시줄 색상을 변경할 수 있습니다. 이러한 단계를 알아보려면 다음 섹션으로 이동하세요. Windows 11에서 제목 표시줄 색상을 변경하는 방법은 무엇입니까? 1. 설정 앱을 사용하여 +를 눌러 설정 창을 엽니다. Windows"개인 설정"으로 이동한 다음

작업 표시줄 축소판은 재미있을 수도 있지만 주의를 산만하게 하거나 짜증나게 할 수도 있습니다. 이 영역 위로 얼마나 자주 마우스를 가져가는지 고려하면 실수로 중요한 창을 몇 번 닫았을 수도 있습니다. 또 다른 단점은 더 많은 시스템 리소스를 사용한다는 것입니다. 따라서 리소스 효율성을 높일 수 있는 방법을 찾고 있다면 비활성화하는 방법을 알려드리겠습니다. 그러나 하드웨어 사양이 이를 처리할 수 있고 미리 보기가 마음에 들면 활성화할 수 있습니다. Windows 11에서 작업 표시줄 축소판 미리 보기를 활성화하는 방법은 무엇입니까? 1. 설정 앱을 사용하여 키를 탭하고 설정을 클릭합니다. Windows에서는 시스템을 클릭하고 정보를 선택합니다. 고급 시스템 설정을 클릭합니다. 고급 탭으로 이동하여 성능 아래에서 설정을 선택합니다. "시각 효과"를 선택하세요.

Windows Installer 페이지에 "OOBELANGUAGE" 문과 함께 "문제가 발생했습니다."가 표시됩니까? 이러한 오류로 인해 Windows 설치가 중단되는 경우가 있습니다. OOBE는 즉시 사용 가능한 경험을 의미합니다. 오류 메시지에서 알 수 있듯이 이는 OOBE 언어 선택과 관련된 문제입니다. 걱정할 필요가 없습니다. OOBE 화면 자체에서 레지스트리를 편집하면 이 문제를 해결할 수 있습니다. 빠른 수정 – 1. OOBE 앱 하단에 있는 “다시 시도” 버튼을 클릭하세요. 그러면 더 이상의 문제 없이 프로세스가 계속됩니다. 2. 전원 버튼을 사용하여 시스템을 강제 종료합니다. 시스템이 다시 시작된 후 OOBE가 계속되어야 합니다. 3. 인터넷에서 시스템 연결을 끊습니다. 오프라인 모드에서 OOBE의 모든 측면을 완료하세요.

Windows 11의 디스플레이 크기 조정과 관련하여 우리 모두는 서로 다른 선호도를 가지고 있습니다. 큰 아이콘을 좋아하는 사람도 있고, 작은 아이콘을 좋아하는 사람도 있습니다. 그러나 올바른 크기 조정이 중요하다는 점에는 모두가 동의합니다. 잘못된 글꼴 크기 조정이나 이미지의 과도한 크기 조정은 작업 시 생산성을 저하시킬 수 있으므로 시스템 기능을 최대한 활용하려면 이를 사용자 정의하는 방법을 알아야 합니다. Custom Zoom의 장점: 화면의 텍스트를 읽기 어려운 사람들에게 유용한 기능입니다. 한 번에 화면에서 더 많은 것을 볼 수 있도록 도와줍니다. 특정 모니터 및 응용 프로그램에만 적용되는 사용자 정의 확장 프로필을 생성할 수 있습니다. 저사양 하드웨어의 성능을 향상시키는 데 도움이 될 수 있습니다. 이를 통해 화면의 내용을 더 효과적으로 제어할 수 있습니다. 윈도우 11을 사용하는 방법

화면 밝기는 최신 컴퓨팅 장치를 사용할 때 필수적인 부분이며, 특히 화면을 장시간 볼 때 더욱 그렇습니다. 눈의 피로를 줄이고, 가독성을 높이며, 콘텐츠를 쉽고 효율적으로 보는 데 도움이 됩니다. 그러나 설정에 따라 밝기 관리가 어려울 수 있으며, 특히 새로운 UI 변경이 적용된 Windows 11에서는 더욱 그렇습니다. 밝기를 조정하는 데 문제가 있는 경우 Windows 11에서 밝기를 관리하는 모든 방법은 다음과 같습니다. Windows 11에서 밝기를 변경하는 방법 [10가지 설명] 단일 모니터 사용자는 다음 방법을 사용하여 Windows 11에서 밝기를 조정할 수 있습니다. 여기에는 단일 모니터를 사용하는 데스크탑 시스템과 노트북이 포함됩니다. 시작하자. 방법 1: 알림 센터 사용 알림 센터에 액세스할 수 있습니다.

Windows의 정품 인증 프로세스에서 갑자기 이 오류 코드 0xc004f069가 포함된 오류 메시지가 표시되는 경우가 있습니다. 활성화 프로세스가 온라인으로 진행되더라도 Windows Server를 실행하는 일부 이전 시스템에서 이 문제가 발생할 수 있습니다. 이러한 초기 점검을 수행하고 시스템 활성화에 도움이 되지 않으면 기본 해결 방법으로 이동하여 문제를 해결하십시오. 해결 방법 - 오류 메시지와 활성화 창을 닫습니다. 그런 다음 컴퓨터를 다시 시작하십시오. Windows 정품 인증 프로세스를 처음부터 다시 시도하세요. 수정 1 – 터미널에서 활성화 cmd 터미널에서 Windows Server Edition 시스템을 활성화합니다. 1단계 – Windows Server 버전 확인 현재 사용하고 있는 W 종류를 확인해야 합니다.
