찾다
php教程php手册MySQL 트랜잭션의 4가지 격리 수준

개발 작업에서 트랜잭션을 사용할 예정인데 어떤 트랜잭션 유형이 있는지 알고 계시나요?
MYSQL 표준은 네 가지 유형의 격리 수준을 정의합니다. 이는 트랜잭션 내부 및 외부의 변경 사항이 표시되고 보이지 않는 것을 제한하는 데 사용됩니다.
격리 수준이 낮을수록 일반적으로 더 높은 동시성을 지원하고 시스템 오버헤드가 더 낮습니다.
격리 수준은 낮음부터 높음까지입니다. 커밋되지 않은 읽기 커밋되지 않은 읽기

이 격리 수준에서는 모든 트랜잭션이 커밋되지 않은 다른 트랜잭션의 실행 결과를 볼 수 있습니다.
이 격리 수준은 성능이 다른 수준보다 그다지 좋지 않기 때문에 실제 응용 프로그램에서는 거의 사용되지 않습니다.
커밋되지 않은 데이터를 읽는 것을 더티 읽기(dirty read)라고도 합니다. [窗口A]:<br> <br> mysql> set GLOBAL tx_isolation='READ-UNCOMMITTED';<br> Query OK, 0 rows affected (0.00 sec)<br> <br> mysql> quit;<br> Bye<br> <br> [root@vagrant-centos65 ~]# mysql -uroot -pxxxx(重新登录)<br> <br> mysql> SELECT @@tx_isolation;<br> ------------------ <br> | @@tx_isolation   |<br> ------------------ <br> | READ-UNCOMMITTED |<br> ------------------ <br> 1 row in set (0.00 sec)<br> <br> mysql> use test;<br> Database changed<br> mysql> begin;<br> Query OK, 0 rows affected (0.00 sec)<br> <br> mysql> select * from user;<br> ---- ------ <br> | id | name |<br> ---- ------ <br> |  1 | a    |<br> |  2 | b    |<br> ---- ------ <br> 2 rows in set (0.00 sec)<br> <br> [窗口B]:<br> mysql> select @@tx_isolation;<br> ------------------ <br> | @@tx_isolation   |<br> ------------------ <br> | READ-UNCOMMITTED |<br> ------------------ <br> 1 row in set (0.00 sec)<br> <br> mysql> begin;<br> Query OK, 0 rows affected (0.00 sec)<br> <br> mysql> insert into test.user values (3, 'c');<br> Query OK, 1 row affected (0.00 sec)<br> <br> mysql> select * from user;<br> ---- ------ <br> | id | name |<br> ---- ------ <br> |  1 | a    |<br> |  2 | b    |<br> |  3 | c    |<br> ---- ------ <br> 3 rows in set (0.00 sec)<br> <br> //目前为止,窗口B并未commit;<br> <br> [窗口A]:<br> mysql> select * from user ;<br> ---- ------ <br> | id | name |<br> ---- ------ <br> |  1 | a    |<br> |  2 | b    |<br> |  3 | c    |<br> ---- ------ <br> 3 rows in set (0.00 sec)[창 A]: mysql> GLOBAL tx_isolation='READ-UNCOMMITTED';
설정 쿼리 확인, 0개 행이 영향을 받음(0.00초)

mysql> 종료;
안녕 <br> [root@vagrant-centos65 ~]# mysql -uroot -pxxxx (다시 로그인)<br> <br> mysql> SELECT @@tx_isolation;<br> ------------------ <br> | @@tx_isolation |<br> ------------------ <br> | 읽기-커밋되지 않음 |<br> ------------------ <br> 1행 세트(0.00초)<br> <br> mysql> 테스트 사용;<br> 데이터베이스가 변경되었습니다<br> mysql>시작;<br> 쿼리 확인, 0개 행이 영향을 받음(0.00초)<br> <br> mysql> 사용자로부터 * 선택;<br> ---- ------ <br> | 아이디 | 이름 |<br> ---- ------ <br> 1 |<br> |2 |<br> ---- ------ <br> 2줄 세트(0.00초)<br> <br> [창 B]:<br> mysql> @@tx_isolation;<br>을 선택하세요. ------------------ <br> | @@tx_isolation |<br> ------------------ <br> | 읽기-커밋되지 않음 |<br> ------------------ <br> 1행 세트(0.00초)<br> <br> mysql>시작;<br> 쿼리 OK, 0개 행이 영향을 받음(0.00초)<br> <br> mysql> test.user 값에 삽입(3, 'c');<br> 쿼리 OK, 1개 행이 영향을 받음(0.00초)<br> <br> mysql> 사용자로부터 * 선택;<br> ---- ------ <br> | 아이디 | 이름 |<br> ---- ------ <br> 1 | |2 | |3 | ---- ------ 3줄 세트(0.00초) //지금까지 창 B는 커밋되지 않았습니다. [창 A]: mysql> 사용자로부터 * 선택 ; ---- ------ | 아이디 | 이름 | ---- ------ 1 | |2 | |3 | ---- ------ 3행 세트(0.00초)읽기 커밋됨(제출된 콘텐츠 읽기) 이는 대부분의 데이터베이스 시스템에 대한 기본 격리 수준입니다(MySQL 기본값은 아님). 이는 격리의 간단한 정의를 충족합니다. 트랜잭션은 커밋된 트랜잭션에 의해 변경된 내용만 볼 수 있습니다. 이 격리 수준은 소위 반복 불가능한 읽기(NonrepeatableRead)도 지원합니다. 동일한 트랜잭션의 다른 인스턴스가 이 인스턴스를 처리하는 동안 새로운 커밋을 가질 수 있으므로 동일한 선택이 다른 결과를 반환할 수 있기 때문입니다. [창 A]: mysql> SET GLOBAL tx_isolation='READ-COMMITTED'; 쿼리 확인, 0개 행이 영향을 받음(0.00초) mysql> 종료; 안녕 [root@vagrant-centos65 ~]# mysql -uroot -pxxxx (다시 로그인) mysql> SELECT @@tx_isolation; ---------------- | @@tx_isolation | ---------------- | 읽기 커밋됨 | ---------------- 1행 세트(0.00초) mysql>시작; 쿼리 OK, 0개 행이 영향을 받음(0.00초) mysql> test.user에서 * 선택; ---- ------ | 아이디 | 이름 | ---- ------ 1 | |2 | ---- ------ 2줄 세트(0.00초) [창 B]: mysql> SELECT @@tx_isolation; ---------------- | @@tx_isolation | ---------------- | 읽기 커밋됨 | ---------------- 1행 세트(0.00초) mysql>시작; 쿼리 확인, 0개 행이 영향을 받음(0.00초) mysql> test.user에서 *를 선택하세요.
---- ------
| 아이디 | 이름 |
---- ------
|  1 | ㄱ    |
|  2 | b    |
---- ------
세트 내 2행(0.00초)

mysql> test.user에서 삭제(id=1;
) 쿼리 확인, 1개 행이 영향을 받음(0.00초)

mysql> test.user에서 *를 선택하세요.
---- ------
| 아이디 | 이름 |
---- ------
|  2 | b    |
---- ------
세트 내 1행(0.00초)

[窗口A]:

mysql> test.user에서 *를 선택하세요.
---- ------
| 아이디 | 이름 |
---- ------
|  1 | ㄱ    |
|  2 | b    |
---- ------
세트 내 2행(0.00초)

[窗구B]:

mysql> 커밋;
쿼리 확인, 0개 행이 영향을 받음(0.02초)

[窗口A]:

mysql> test.user에서 *를 선택하세요.
---- ------
| 아이디 | 이름 |
---- ------
|  2 | b    |
---- ------
1행 세트(0.00초)반복 읽기(可重读)

这是MySQL의 默认事务隔离级别, 它确保同一事务的多个实例는 并发读取数据时, 会看到同样的数据行.
不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。
简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又에서 该范围内插入了new行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
InnoDB와 Falcon은 MVCC, 다중 버전 동시성 제어(Multiversion Concurrency Control)를 지원합니다.[窗口A]:<code class="prettyprint linenums lang-php">[窗口A]:<br> <br> mysql> SET GLOBAL tx_isolation='REPEATABLE-READ';<br> Query OK, 0 rows affected (0.00 sec)<br> <br> mysql> quit;<br> Bye<br> <br> [root@vagrant-centos65 ~]# mysql -uroot -pxxxx(重新登录)<br> <br> mysql> SELECT @@tx_isolation;<br> ----------------- <br> | @@tx_isolation  |<br> ----------------- <br> | REPEATABLE-READ |<br> ----------------- <br> 1 row in set (0.00 sec)<br> <br> mysql> begin;<br> Query OK, 0 rows affected (0.00 sec)<br> <br> [窗口B]:<br> <br> mysql> quit;<br> Bye<br> <br> [root@vagrant-centos65 ~]# mysql -uroot -pxxxx(重新登录)<br> <br> mysql> SELECT @@tx_isolation;<br> ----------------- <br> | @@tx_isolation  |<br> ----------------- <br> | REPEATABLE-READ |<br> ----------------- <br> 1 row in set (0.00 sec)<br> <br> mysql> insert into test.user values (4, 'd');<br> Query OK, 1 row affected (0.00 sec)<br> <br> mysql> select * from test.user;<br> ---- ------ <br> | id | name |<br> ---- ------ <br> |  2 | b    |<br> |  4 | d    |<br> ---- ------ <br> 2 rows in set (0.00 sec)<br> <br> [窗口A]:<br> <br> mysql> select * from test.user;<br> ---- ------ <br> | id | name |<br> ---- ------ <br> |  2 | b    |<br> ---- ------ <br> 1 rows in set (0.00 sec)<br> <br> mysql> commit;<br> Query OK, 0 rows affected (0.00 sec)<br> <br> mysql> select * from test.user;<br> ---- ------ <br> | id | name |<br> ---- ------ <br> |  2 | b    |<br> |  4 | d    |<br> ---- ------ <br> 2 rows in set (0.00 sec) mysql> 전역 설정 tx_isolation='REPEATABLE-READ'; 쿼리 확인, 0개 행이 영향을 받음(0.00초)

mysql> 그만둬;
안녕 [root@vagrant-centos65 ~]# mysql -uroot -pxxxx(중신登录) mysql> SELECT @@tx_isolation; ----------------- | @@tx_isolation  | ----------------- | 반복 읽기 가능 | ----------------- 세트 내 1행(0.00초) mysql> 시작; 쿼리 확인, 0개 행이 영향을 받음(0.00초) [窗구B]: mysql> 그만둬; 안녕 [root@vagrant-centos65 ~]# mysql -uroot -pxxxx(중신登录) mysql> SELECT @@tx_isolation; ----------------- | @@tx_isolation  | ----------------- | 반복 읽기 가능 | ----------------- 세트 내 1행(0.00초) mysql> test.user 값(4, 'd')에 삽입합니다. 쿼리 확인, 1개 행이 영향을 받음(0.00초) mysql> test.user에서 *를 선택하세요. ---- ------ | 아이디 | 이름 | ---- ------ |  2 | b    | |  4 | d    | ---- ------ 세트 내 2행(0.00초) [窗口A]: mysql> test.user에서 *를 선택하세요. ---- ------ | 아이디 | 이름 | ---- ------ |  2 | b    | ---- ------ 세트 내 행 1개(0.00초) mysql> 커밋; 쿼리 확인, 0개 행이 영향을 받음(0.00초) mysql> test.user에서 *를 선택하세요. ---- ------ | 아이디 | 이름 | ---- ------ |  2 | b    | |  4 | d    | ---- ------ 세트 내 2행(0.00초)직렬화 가능(序列化执行) 这是最高 隔离级别,它通过强序,使之不可能序,互冲突,从而解决幻读问题。즉, 읽은 각 데이터 행에 공유 잠금을 추가합니다. 이 수준에서는 시간 초과와 잠금 경합이 많이 발생할 수 있습니다. [窗口A]:<br> <br> mysql> SET GLOBAL tx_isolation='SERIALIZABLE';<br> Query OK, 0 rows affected (0.00 sec)<br> <br> mysql> quit;<br> Bye<br> <br> [root@vagrant-centos65 ~]# mysql -uroot -pxxxx(重新登录)<br> <br> mysql> SELECT @@tx_isolation;<br> ---------------- <br> | @@tx_isolation |<br> ---------------- <br> | SERIALIZABLE   |<br> ---------------- <br> 1 row in set (0.00 sec)<br> <br> mysql> select * from test.user;<br> ---- ------ <br> | id | name |<br> ---- ------ <br> |  2 | b    |<br> |  4 | d    |<br> ---- ------ <br> 2 rows in set (0.00 sec)<br> <br> mysql> begin;<br> Query OK, 0 rows affected (0.00 sec)<br> <br> mysql> insert into test.user values (5, 'e');<br> Query OK, 1 row affected (0.00 sec)<br> <br> [窗口B]:<br> <br> mysql> quit;<br> Bye<br> <br> [root@vagrant-centos65 ~]# mysql -uroot -pxxxx(重新登录)<br> <br> mysql> SELECT @@tx_isolation;<br> ---------------- <br> | @@tx_isolation |<br> ---------------- <br> | SERIALIZABLE   |<br> ---------------- <br> 1 row in set (0.00 sec)<br> <br> mysql> select * from test.user;<br> ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction<br> <br> [窗口A]:<br> <br> mysql> commit;<br> Query OK, 0 rows affected (0.01 sec)<br> <br> [窗口B]:<br> <br> mysql> mysql> select * from test.user;<br> ---- ------ <br> | id | name |<br> ---- ------ <br> |  2 | b    |<br> |  4 | d    |<br> |  5 | e    |<br> ---- ------ <br> 3 rows in set (0.00 sec)감사합니다~

출처: http://mp.weixin.qq.com/s?__biz=MjM5NDM4MDIwNw==&mid=2448834642&idx=1&sn=c02c5cc8ab0c1f29142ac8f8aa6b78af#rd

더 자세한 [마른 정보 공유]를 원하시면 제 개인 구독 계정을 팔로우해주세요.
MySQL 트랜잭션의 4가지 격리 수준

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
了解Python编程的入门级代码示例了解Python编程的入门级代码示例Jan 04, 2024 am 10:50 AM

了解Python编程的入门级代码示例Python是一种简单易学,功能强大的编程语言。对于初学者来说,了解Python编程的入门级代码示例是非常重要的。本文将为您提供一些具体的代码示例,帮助您快速入门。打印HelloWorldprint("HelloWorld")这是Python中最简单的代码示例。print()函数用于将指定的内容输出

PHP переменные в действии: 10 реальных примеров использованияPHP переменные в действии: 10 реальных примеров использованияFeb 19, 2024 pm 03:00 PM

PHP变量存储程序运行期间的值,对于构建动态且交互式的WEB应用程序至关重要。本文将深入探讨php变量,并通过10个真实的示例展示它们的实际应用。1.存储用户输入$username=$_POST["username"];$passWord=$_POST["password"];此示例从表单提交中提取用户名和密码,并将其存储在变量中以供进一步处理。2.设置配置值$database_host="localhost";$database_username="username";$database_pa

从入门到精通:Go语言中常用数据结构的代码实现从入门到精通:Go语言中常用数据结构的代码实现Mar 04, 2024 pm 03:09 PM

标题:从入门到精通:Go语言中常用数据结构的代码实现数据结构在编程中起着至关重要的作用,它是程序设计的基础。在Go语言中,有许多常用的数据结构,掌握这些数据结构的实现方式对于成为一名优秀的程序员至关重要。本文将介绍Go语言中常用的数据结构,并给出相应的代码示例,帮助读者从入门到精通这些数据结构。1.数组(Array)数组是一种基本的数据结构,是一组相同类型

如何使用PHP编写库存管理系统中的库存分仓管理功能代码如何使用PHP编写库存管理系统中的库存分仓管理功能代码Aug 06, 2023 pm 04:49 PM

如何使用PHP编写库存管理系统中的库存分仓管理功能代码库存管理是许多企业中不可或缺的一部分。对于拥有多个仓库的企业来说,库存分仓管理功能尤为重要。通过合理管理和跟踪库存,企业可以实现不同仓库之间的库存调拨,优化运营成本,改善协同效率。本文将介绍如何使用PHP编写库存分仓管理功能的代码,并为您提供相关的代码示例。一、建立数据库在开始编写库存分仓管理功能的代码之

Java实现简单的冒泡排序代码Java实现简单的冒泡排序代码Jan 30, 2024 am 09:34 AM

Java冒泡排序最简单的代码示例冒泡排序是一种常见的排序算法,它的基本思想是通过相邻元素的比较和交换来将待排序序列逐步调整为有序序列。下面是一个简单的Java代码示例,演示了如何实现冒泡排序:publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){int

Go语言编程实例:Web开发中的代码示例Go语言编程实例:Web开发中的代码示例Mar 04, 2024 pm 04:54 PM

《Go语言编程实例:Web开发中的代码示例》随着互联网的快速发展,Web开发已经成为各行业中必不可少的一部分。作为一门功能强大且性能优越的编程语言,Go语言在Web开发中越来越受到开发者们的青睐。本文将通过具体的代码示例,介绍如何利用Go语言进行Web开发,让读者能够更好地理解和运用Go语言来构建自己的Web应用。1.简单的HTTP服务器首先,让我们从一个

华为云边缘计算对接指南:Java代码示例快速实现接口华为云边缘计算对接指南:Java代码示例快速实现接口Jul 05, 2023 pm 09:57 PM

华为云边缘计算对接指南:Java代码示例快速实现接口随着物联网技术的快速发展和边缘计算的兴起,越来越多的企业开始关注边缘计算的应用。华为云提供了边缘计算服务,为企业提供了高可靠的计算资源和便捷的开发环境,使得边缘计算应用更加容易实现。本文将介绍如何通过Java代码快速实现华为云边缘计算的接口。首先,我们需要准备好开发环境。确保你已经安装了Java开发工具包(

指导与示例:学习Java选择排序算法的实现指导与示例:学习Java选择排序算法的实现Feb 18, 2024 am 10:52 AM

Java选择排序法代码编写指南及示例选择排序是一种简单直观的排序算法,其思想是每次从未排序的元素中选择最小(或最大)的元素进行交换,直到所有元素排序完成。本文将提供选择排序的代码编写指南,并附上具体的Java示例代码。算法原理选择排序的基本原理是将待排序数组分为已排序和未排序两部分,每次从未排序部分选择最小(或最大)的元素,将其放到已排序部分的末尾。重复上述

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구