在DB层面实现分布式锁的方法有:利用MySQL的内置函数 get_lock(key, timeout)来实现,这个函数的约定在指定时间内持有锁,它锁的是一行中的某一个字段么?还是锁的是一行?具体项目中是如何使用的?查了一些资料,大概是先约定同一个key,然后先执行get_lock(key,timeout)的,会持有锁,其他的sql只能等待;除非当前的线程释放锁release(key),但是它是如何在项目中控制锁的粒度呢?最好有实例能详解一下。谢谢~~
伊谢尔伦2017-04-18 09:45:21
이 잠금은 애플리케이션 수준이며 서로 다른 mysql 세션 간에 사용됩니다. 이는 단지 이름 잠금일 뿐이며, 사용자가 이해하는 테이블, 행 및 필드와 직접적인 관계가 없습니다. 특정 잠금은 전적으로 애플리케이션에 달려 있습니다. 이는 배타적 잠금입니다. 즉, 어떤 세션이 잠금을 보유하든 다른 세션은 잠금을 얻으려고 시도할 때 실패합니다.
예를 들어 레코드 A의 행을 잠그려면 현재 세션에서 잠금을 생성합니다get_lock("record A", 10)
. 이때 다른 모든 세션은 명시적으로 get_lock("record A", 10)
을 호출하지 않는 한 마음대로 레코드 A에 액세스하고 수정할 수 있습니다.
즉, 잠금 확인 여부를 결정하는 것은 전적으로 애플리케이션에 달려 있습니다. 잠그고 싶다면 레코드 A에 액세스할 때 모든 세션이 명시적으로 get_lock("record A", 10)
을 호출하도록 하세요. 그러면 분명히 하나의 세션만 성공할 수 있습니다. 다른 세션은 시간 초과를 기다리거나 잠금을 보유한 세션에서 release_lock
를 호출한 후에만
마찬가지로 필드 열 A를 잠그려면 위와 같이 잠금을 생성get_lock("column A", 10)
하세요. 간단히 말해서 잠금을 설정할지 여부를 결정하는 것은 애플리케이션에 달려 있으며 데이터베이스는 이 메커니즘만 제공합니다. 모든 사람이 동일한 잠금을 잡는지 확인하려면 첫 번째 매개변수 잠금 이름의 문자열이 다르다는 사실만을 기반으로 하므로 실수를 방지하기 위해 잠금 이름 앞에 테이블 이름과 데이터베이스 이름을 추가하는 것이 가장 좋습니다. 부상