거래의 기본 요소 (ACID)
원 자성 (자성)
- 트랜잭션이 모든 작업을 시작하거나 모두가하지 않는 일, 또는 결국, 중간 부분에 부착 할 수 없습니다. 오류가 트랜잭션의 실행 중에 발생한 트랜잭션이 시작되기 전에 다시 상태로 출시 될 예정 모든 작업은 결코 일어나지 않았다 좋아합니다. 그 거래는, 지금까지 원자 고등학교 화학처럼 불가분 전체 인 물질의 기본 단위입니다.
일관성 (일관성)
- 시작하기 전에 트랜잭션의 종료 후, 데이터베이스의 무결성 제약이 손상되지 않습니다. 예를 들어, B에 대한 전송은, A가 차감 돈이 될 수 없다, B는받지 못했습니다.
절연 (절연)
- 동시에, 다른 트랜잭션들 사이에서 서로 간섭하지 않고 같은 데이터에 대해 하나 개의 트랜잭션 요청. 예를 들어, A는 B가 카드에 송금 할 수없는, 은행 카드에서 돈을 인출하는 과정 A의 끝나기 전에 돈을 인출하는 것입니다.
영구 (내구성)
- 트랜잭션이 완료되면, 데이터베이스에 대한 모든 업데이트가 데이터베이스에 저장됩니다 트랜잭션이 롤백 할 수 없습니다.
동시 거래
더러운 읽기
- 거래 트랜잭션 B가 데이터 업데이트 및 롤백 B를 읽고, A는 데이터를 읽을 더티 데이터입니다
비 반복 읽기
- 트랜잭션 A가 여러 번 트랜잭션 A를 결과, 데이터가 여러 번 업데이트하고 제출 된 읽기 트랜잭션 A는 트랜잭션 B의 과정에서, 여러 번 같은 데이터를 읽어 동일한 데이터를 읽고, 그 결과는 일치하지 않습니다.
매직 읽기
- 데이터베이스 시스템 관리자는 변경 등급 ABCDE에서 모든 학생들을위한 특정 점수가 발생합니다,하지만 시스템 관리자가 A 레코드를 변경하는 경우 시스템 관리자 B는이 있음을 발견 끝나지 않는다,이 시간에 기록 된 특정 점수를 삽입합니다 환각으로 일어난처럼 하룻밤 변경이 팬텀 읽기라고합니다.
요약 : 비 반복 읽기 및 팬텀 쉽게 혼동 읽기, 반복 불가능한 읽기가 수정에 초점을 맞추고, 팬텀 추가 또는 삭제에 초점을 읽습니다. 단지 라인의 조건을 충족하는 잠금 비 반복 읽기의 문제를 해결, 필요성은 팬텀 읽기 잠금 테이블을 해결하기 위해
MySQL의 트랜잭션 격리 수준
트랜잭션 격리 수준 | 더러운 읽기 | 비 반복 읽기 | 매직 읽기 |
---|---|---|---|
확약 읽기 (읽기 커밋되지 않은) | 그것은이다 | 그것은이다 | 그것은이다 |
최선을 다하고 읽기 (읽기 커밋) | 아니오 | 그것은이다 | 그것은이다 |
반복 읽기 (반복-읽기) | 아니오 | 아니오 | 그것은이다 |
직렬화 (직렬화) | 아니오 | 아니오 | 아니오 |
- MySQL은 반복 읽기입니다
- 의 MyISAM은 비 반복 읽기입니다
격리 수준
현재 격리 수준보기
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)
격리 수준 변경
mysql> set session transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@tx_isolation;
+------------------+
| @@tx_isolation |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set, 1 warning (0.00 sec)
확약 읽기 (읽기 커밋되지 않은) 테스트
- 두 클라이언트는 격리 수준을 수정
- (코우) 트랜잭션 개시 1, 3 (2)에
- 이 시간 kou1 지르지 만, 그가 발견 된 코우 데이터를 수정
- 이 시간 롤백 후 코우가 발견 kou1는 잘못된 데이터 인 경우
비 반복 읽기 (읽기 최선을 다하고 있습니다)
- kou1 오픈 코우 업무
- kou1는 코우 변경 및 커밋 된 트랜잭션되는 읽기되었다. 그런 다음 kou1 읽기 (kou1가 문제이며, 지르지 않은) 트랜잭션은 새로운 데이터에 참석, 트랜잭션에있는 두 개의 결과를 읽어 보시기 바랍니다. 그것은 비 반복 읽기 현상을 일으켰다.
그 수준은 읽기 확약보다 높다
- 더러운 읽기의 문제를 해결
- kou1 트랜잭션이 끝나지 않았습니다 만, 코우 제출, kou1는 두 개의 다른 데이터에서 발견
반복 읽기
- 코우 업무
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from book;
+----+-----------+-----------+
| id | name | author |
+----+-----------+-----------+
| 1 | 红楼梦 | 曹雪芹 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
+----+-----------+-----------+
3 rows in set (0.00 sec)
mysql> insert into book values(4,4,4);
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.01 sec)
- kou1 업무
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from book;
+----+-----------+-----------+
| id | name | author |
+----+-----------+-----------+
| 1 | 红楼梦 | 曹雪芹 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
+----+-----------+-----------+
3 rows in set (0.00 sec)
mysql> insert into book values(4,4,4);
ERROR 1062 (23000): Duplicate entry '4' for key 'PRIMARY'
mysql> select * from book;
+----+-----------+-----------+
| id | name | author |
+----+-----------+-----------+
| 1 | 红楼梦 | 曹雪芹 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
+----+-----------+-----------+
3 rows in set (0.00 sec)
-
4 삽입 이번에는 삽입 할 수 없지만, 쇼 아무것도 보이지 않았다. 이 팬텀 읽기입니다
-
당신은 새로운 데이터에 대한 정보를 읽고 싶어, 당신은 새로운 데이터 쿼리 이후에 추가 될 수있다 읽으려면, 새로운 작품을 읽지 않은 경우 업데이트에 대한 데이터가 최신 버전에서 발견 할 수 있도록, 기록 동작 또는 커밋.