목차
列个场景
等待结局" >等待结局
假如这样呢" >假如这样呢

mysql之死锁_MySQL

May 30, 2016 pm 05:10 PM
이중 자물쇠

其实,看到“死锁”二字,不需要王二,就是我,来再废口舌,这两个字名如其意,已经可以透过现象看本质了。不过呢,我虽然长着一副程序猿的样子,但一直没有理解好mysql的死锁概念,为此还曾苦恼过,觉得自己有愧于程序猿的脸面。有幸第N次拜读《高性能mysql》,恍惚间觉得自己明白了一些,也就是有点对得起程序猿这三个字了。

死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。

看看人家说得多好,可我王二愣是不能够发自于肺腑的理解,在这条路上走了很多弯路。

列个场景

回到洛阳后,我一直做的是大宗期货交易项目,既然是交易,肯定涉及到数据的多并发,大宗期货交易的模式很复杂,说实话,我维护了整个项目的正常运作,但对于“买涨”、“买跌”都有可能赚钱的路数,还是不清楚,只能怪自己太迟钝。所以只好举个简单的例子了。

我有两个好朋友,一个叫王一,一个叫王三,一个芳龄十八(本来想年方二八呢,一想这年龄好像未成年,觉得不合适),一个芳龄29,一个如花似玉,一个风韵犹存。王二,也就是我,作为一个屌丝男,能够交到这两个异性朋友,真是托了程序员的福。

那天王一很苦恼,她不知道怎么把win7操作系统升级到win10,小青年都挺喜欢接受新东西,于是找到了我,丢给我一句:“猿兄,帮我忙呗,升级个操作系统!”“当然好啊,大哥我巴不得啊”,我心里这样想,但是强装淡定,于是回了句“恩,稍等,哥忙着呢。”不过最终我成功帮她升级了操作系统,这妹的,崇拜我得不行,于是就成为了朋友。 关于王三,算了,我再这么无耻的yy下去,你肯定要来打醒我了,就这样吧。

场景就是,算了,还是上sql吧,我y不下去了。

<code class="language-sql hljs ">START TRANSACTION;
update girl SET age=18 where id=2;
update girl set age=29 where id=1;
COMMIT;</code>
로그인 후 복사
<code class="language-sql hljs "><code class="language-sql hljs ">START TRANSACTION;
UPDATE girl set age=19 where id=1;
update girl set age=30 where id=2;
commit;</code></code>
로그인 후 복사

<code class="language-sql hljs ">如果凑巧,两个事务都执行了第一条update语句,分别修改了王一和王三的年纪,同时也锁定了改行语句,接着,每个事务都尝试执行第二条语句时,却发现该行已被对方锁定,然后两个事务都在等待对方释放锁,同时又持有对方需要的锁,则陷入死循环。

<code class="language-sql hljs ">也就是说,逝水流年,王一和王三也逃不过时光的蹉跎,然而,在我心中,也就是王二的心中,却永远都不想他们老去,于是我和时光老人就干上了架,这会发生什么呢?

<code class="language-sql hljs ">等待结局

<code class="language-sql hljs ">时光老人 <code class="language-sql hljs ">王二
<code class="language-sql hljs ">[SQL]START TRANSACTION;<br /> 受影响的行: 0<br /> 时间: 0.000s<br /> [SQL]UPDATE girl set age=19 where id=1;<br /> 受影响的行: 0<br /> 时间: 0.001s <code class="language-sql hljs ">[SQL]START TRANSACTION;<br /> 受影响的行: 0<br /> 时间: 0.000s<br /> [SQL]update girl SET age=18 where id=2;<br /> 受影响的行: 1<br /> 时间: 0.001s
<code class="language-sql hljs ">[SQL]update girl set age=30 where id=2; <code class="language-sql hljs ">[SQL]update girl set age=29 where id=1;<br /> [Err] 1213 - Deadlock found when trying to get lock; try restarting transaction

<code class="language-sql hljs ">innodb存储引擎,能检测到死锁的循环依赖,并立即返回一个错误。

<code class="language-sql hljs ">好吧,我还是干不过时光老人!

<code class="language-sql hljs ">假如这样呢

<code class="language-sql hljs ">故事到这里肯定是没有结束啊,我得想想办法,避免和时光老人发生冲突,于是就这样吧!

<code class="language-sql hljs "><code class="language-sql hljs "><code class="language-sql hljs ">START TRANSACTION;
UPDATE girl set age=19 where id=1;
update girl set age=30 where id=2;
commit;</code></code></code>
로그인 후 복사
<code class="language-sql hljs "><code class="language-sql hljs "><code class="language-sql hljs "><code class="language-sql hljs ">START TRANSACTION;
update girl SET age=18 where id=1;
update girl set age=29 where id=2;
COMMIT;</code></code></code></code>
로그인 후 복사

<code class="language-sql hljs "><code class="language-sql hljs "><code class="language-sql hljs ">也就是说,在实战当中,假如我们遇到类似的问题,虽然innodb为我们做了错误的检测,但是我们还是要避免死锁的。

<code class="language-sql hljs ">时光老人 <code class="language-sql hljs ">王二
<code class="language-sql hljs "><code class="language-sql hljs "><code class="language-sql hljs ">[SQL]START TRANSACTION;<br> 受影响的行: 0<br> 时间: 0.037s<br> <br> [SQL]<br> UPDATE girl set age=19 where id=1;<br> 受影响的行: 0<br> 时间: 0.001s <code class="language-sql hljs "><code class="language-sql hljs "><code class="language-sql hljs ">[SQL]START TRANSACTION;<br> 受影响的行: 0<br> 时间: 0.001s<br> <br> [SQL]<br> update girl SET age=18 where id=1;

 

<code class="language-sql hljs "><code class="language-sql hljs "><code class="language-sql hljs ">也就是说,在有这样的update时,尽量按照顺序来执行,避免冲突。当然了,情况不同,你如果不想这样,那就请不要相信我的鬼话,哈哈哈!

<code class="language-sql hljs "><code class="language-sql hljs "><code class="language-sql hljs ">好了,好了,mysql之死锁就这样结束吧!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 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를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

C++ 개발에서 교착 상태 문제를 처리하는 방법 C++ 개발에서 교착 상태 문제를 처리하는 방법 Aug 22, 2023 pm 02:24 PM

C++ 개발에서 교착 상태 문제를 처리하는 방법 교착 상태는 다중 스레드 프로그래밍, 특히 C++로 개발할 때 발생하는 일반적인 문제 중 하나입니다. 여러 스레드가 서로의 리소스를 기다릴 때 교착 상태 문제가 발생할 수 있습니다. 제때에 처리하지 않으면 교착 상태로 인해 프로그램이 정지될 뿐만 아니라 시스템의 성능과 안정성에도 영향을 미칩니다. 따라서 C++ 개발에서 교착 상태 문제를 해결하는 방법을 배우는 것은 매우 중요합니다. 1. 교착상태의 원인을 이해합니다. 교착상태 문제를 해결하려면 먼저 교착상태의 원인을 이해해야 합니다. 교착상태는 일반적으로 다음과 같은 경우에 발생합니다.

golang 함수 동시성 제어에서 교착 상태 및 기아 현상 예방 및 해결 golang 함수 동시성 제어에서 교착 상태 및 기아 현상 예방 및 해결 Apr 24, 2024 pm 01:42 PM

Go의 교착 상태 및 기아 상태: 교착 상태 방지 및 해결: 코루틴이 서로를 기다리고 있으며 작업을 수행할 수 없습니다. 감지하려면 Runtime.SetBlockProfileRate 함수를 사용하세요. 교착 상태 방지: 세분화된 잠금, 시간 제한 및 잠금 없는 데이터 구조를 사용하여 교착 상태를 방지합니다. 기아(Starvation): 코루틴은 계속해서 리소스를 얻을 수 없으며, 기아를 방지하기 위해 공정한 잠금이 사용됩니다. 공정한 잠금 연습: 공정한 잠금을 생성하고 코루틴이 가장 오랫동안 잠금을 획득하려고 시도하여 잠금을 먼저 획득할 때까지 기다립니다.

Go 개발에서 교착 상태를 해결하는 방법 Go 개발에서 교착 상태를 해결하는 방법 Jun 30, 2023 pm 04:58 PM

Go 언어 개발 시 교착 상태 문제를 해결하는 방법 Go 언어는 동시 프로그래밍에서 널리 사용되는 오픈 소스 정적인 유형의 컴파일 언어입니다. 그러나 Go 언어의 동시성 모델의 특성으로 인해 개발자는 동시성 프로그램을 작성할 때 종종 교착 상태 문제에 직면합니다. 이 기사에서는 Go 언어 개발의 교착 상태 문제를 해결하는 몇 가지 방법을 소개합니다. 먼저 교착상태(Deadlock)가 무엇인지부터 이해해야 합니다. 교착 상태는 여러 동시 작업이 서로 리소스를 해제하기를 기다리고 있기 때문에 계속 실행할 수 없는 상황을 나타냅니다. Go 언어에서 교착 상태 문제는 일반적으로 리소스 경쟁이나 경쟁으로 인해 발생합니다.

C++ 다중 스레드 프로그래밍의 교착 상태 방지 및 감지 메커니즘 C++ 다중 스레드 프로그래밍의 교착 상태 방지 및 감지 메커니즘 Jun 01, 2024 pm 08:32 PM

다중 스레드 교착 상태 방지 메커니즘에는 다음이 포함됩니다. 1. 잠금 순서 2. 테스트 및 설정. 감지 메커니즘에는 다음이 포함됩니다. 1. 시간 초과 2. 교착 상태 감지기. 이 기사에서는 공유 은행 계좌의 예를 들어 잠금 시퀀스를 통해 교착 상태를 방지합니다. 이체 기능은 먼저 이체 계좌 잠금을 요청한 다음 계좌 이체를 요청합니다.

C++ 프로그램에서 교착 상태를 디버깅하는 방법은 무엇입니까? C++ 프로그램에서 교착 상태를 디버깅하는 방법은 무엇입니까? Jun 03, 2024 pm 05:24 PM

교착 상태는 여러 스레드가 서로 보유한 잠금을 기다릴 때 발생하는 동시 프로그래밍의 일반적인 오류입니다. 디버거를 사용하여 교착 상태를 감지하고, 스레드 활동을 분석하고, 관련된 스레드 및 잠금을 식별하여 교착 상태를 해결할 수 있습니다. 교착 상태를 해결하는 방법에는 순환 종속성 방지, 교착 상태 감지기 사용 및 시간 초과 사용이 포함됩니다. 실제로 스레드가 동일한 순서로 잠금을 획득하도록 하거나 재귀 잠금 또는 조건 변수를 사용하여 교착 상태를 방지할 수 있습니다.

시스템 교착 상태의 이유는 무엇입니까? 시스템 교착 상태의 이유는 무엇입니까? Sep 04, 2023 pm 02:44 PM

시스템의 교착상태 원인에는 상호 배제 조건, 요청 및 유지 조건, 불가피 조건, 순환 대기 조건 등이 있습니다. 자세한 소개: 1. 상호 배타적 조건, 여러 스레드가 동시에 특정 공유 리소스에 액세스해야 하며 이러한 리소스는 한 번에 하나의 스레드만 점유할 수 있습니다. 한 스레드가 특정 리소스를 점유하면 다른 스레드는 대기해야 합니다. 2, 요청 및 보류 조건 스레드가 특정 리소스를 보유하는 동안 다른 스레드가 보유하는 리소스도 요청하면 스레드가 대기하게 됩니다. , 등.

Go 언어의 교착 상태 문제를 해결하는 방법은 무엇입니까? Go 언어의 교착 상태 문제를 해결하는 방법은 무엇입니까? Oct 08, 2023 pm 05:07 PM

Go 언어의 교착 상태 문제를 해결하는 방법은 무엇입니까? Go 언어에는 동시 프로그래밍 기능이 있으며 고루틴과 채널을 사용하여 동시 작업을 구현할 수 있습니다. 그러나 교착 상태는 동시 프로그래밍에서 흔히 발생하는 문제입니다. 고루틴이 서로의 리소스에 의존하고 이러한 리소스에 액세스할 때 순환 종속성을 생성하면 교착 상태가 발생할 수 있습니다. 이 기사에서는 Go 언어의 교착 상태 문제를 해결하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 먼저, 무엇인지 이해합시다

Python의 동시 프로그래밍 문제: 교착 상태 및 경쟁 조건과의 싸움 Python의 동시 프로그래밍 문제: 교착 상태 및 경쟁 조건과의 싸움 Feb 19, 2024 pm 02:40 PM

교착 상태 교착 상태는 여러 스레드가 서로 리소스를 기다리면서 결국 모든 스레드가 차단되는 루프를 형성하는 경우입니다. Python에서 교착 상태는 일반적으로 여러 잠금 또는 뮤텍스가 잘못된 순서로 잠길 때 발생합니다. 예: importthreading#두 개의 스레드가 두 개의 잠금을 공유합니다. lock1=threading.Lock()lock2=threading.Lock()defthread1_func():lock1.acquire()lock2.acquire()#일부 작업 수행 lock2.release()lock1. )defthread2_func():loc

See all articles