2013-11-14 1 views
0

데이터베이스에 데이터를 쓰는 데 트랜잭션을 사용하는 서버가 있는데 모든 쿼리가 성공하면 롤백됩니다. 이제 같은 데이터베이스와 테이블에서 동시에 두 인스턴스의 서버 작업을 수행하려고합니다. mysql 트랜잭션 문서를 읽을 때 "트랜잭션 시작으로 인해 보류중인 트랜잭션이 커밋됩니다."라는 문구가 나타났습니다. 이것은 서버 A가 트랜잭션 A를 시작하고 트랜잭션 A가 아직 완료되지 않은 상태에서 서버 B가 트랜잭션 B를 시작하고 트랜잭션 A가 강제 실행된다는 것을 의미합니까? 이것은 나에게 이해가되지 않는다. 이 경우 트랜잭션 A가 정상적으로 완료 될 때까지 트랜잭션 B가 실행되지 않도록 어떻게 보장 할 수 있습니까? SET autocommit = 0이 문제의 대안이 될 수 있습니까?새 트랜잭션을 시작하면 현재 트랜잭션이 강제로 커밋됩니까?

답변

1

서버의 두 인스턴스가 동시에 작동하도록한다고 가정 할 때 동일한 서버에서 실행되는 두 개의 개별 세션을 의미한다고 가정합니다.

"트랜잭션 시작으로 인해 커밋 된 트랜잭션이 발생합니다."라는 문장은 동일한 세션 내에서만 보류중인 트랜잭션을 나타냅니다. 이 섹션 (그들에 대한 동의어)로 나열 http://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

명령문 당신이이 문을 실행하기 전에 COMMIT했던 것처럼 암시 적으로, 현재 세션에서 활성화 된 트랜잭션을 종료에서.

따라서 세션 B가 세션 A가 커밋되기 전에 트랜잭션을 시작하면 세션 A가 강제로 커밋되지 않습니다.

0
mysql> CREATE TEMPORARY TABLE super(id int); 
Query OK, 0 rows affected (0.04 sec) 

mysql> START TRANSACTION; 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO super VALUE(1); 
Query OK, 1 row affected (0.00 sec) 

mysql> START TRANSACTION; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT * FROM super; 
+------+ 
| id | 
+------+ 
| 1 | 
+------+ 
1 row in set (0.00 sec) 
관련 문제