mysql의 업데이트 문의 반환 결과: 1. 데이터베이스 URL에 "useAffectedRows=true" 매개변수가 없으면 일치하는 행 수가 반환됩니다. 2. "useAffectedRows=true" 매개변수가 있는 경우; 데이터베이스 URL, 영향을 받은 행이 숫자로 반환됩니다.
이 튜토리얼의 운영 환경: windows10 시스템, mysql8.0.22 버전, Dell G3 컴퓨터.
업데이트 문의 결과는 무엇인가요? 아니면 행 수에 영향을 줍니까?
먼저 결과에 대해 이야기해 보겠습니다. 데이터베이스의 URL이
jdbc:mysql://gitlab.fzghjx.com:3306/cron
인 경우 반환되는 결과는 일치하는 행 수(일치하는 행)입니다.
다음과 같은 경우:
jdbc:mysql://gitlab.fzghjx.com:3306/cron?useAffectedRows=true
이면 영향을 받은 행(변경됨) 수가 반환됩니다.
요약하자면:
url에 useAffectedRows=true 매개변수가 없으면 일치하는 행 수가 반환됩니다. 그렇다면 영향을 받은 행 수가 반환됩니다.
반환 값을 영향을 받은(변경된) 레코드 수로 만드는 방법은 무엇입니까?
mysql 데이터 연결 URL 매개변수에 useAffectedRows=true만 추가하면 됩니다
jdbc.url=jdbc:mysql://localhost:3306/ssm?useAffectedRows=true
확장 지식:
Guess
cmd를 통해 mysql 업데이트 문을 조작하면 실제로 화면은 다음과 같습니다.
이 질문에 대해 생각해 보면 우선 두 가지 대답이 있습니다. 1. mysql 서버의 반환 결과에서 판단하십시오. 이것이 true로 설정되면, false이면 일치하는 행의 값을 반환합니다. 이면 Changed 값이 반환됩니다. 2. 쿼리 문으로 돌아갈 때 이 값을 선택합니다.
확인됨
연결을 만드는 전체 과정을 설명하는 사진을 빌려주세요:
(사진 출처: https://blog.csdn.net/c929833623lvcha/article/details/44517245 )
한동안 조사한 결과 이 두 가지 생각이 모두 틀렸다는 것을 알게 되었습니다. 구체적으로:
간단한 jdbc 쿼리를 작성했습니다.
소스 코드에 따르면 추적에 따르면 mysql이 연결을 설정할 때 useAffectedRows=true 매개변수가 사용됩니다. 연결의 속성으로.
Connection connection = DriverManager.getConnection("jdbc:mysql://gitlab.fzghjx.com:3306/cron?useAffectedRows=true", "root", "root");
에서 다음을 따르세요.
계속: 연결 방법은 java.sql.Driver#connect, 구현은 com.mysql.jdbc.NonRegisteringDriver#connect
useAffectedRows=true입니다. com.mysql.jdbc.NonRegisteringDriver#parseURL 메소드에서 읽고 Properties 소품에 설정합니다.
더 아래로: com.mysql.jdbc.ConnectionImpl#getInstance 연결 인스턴스를 가져옵니다
여기 반사가 있으며 인수는 JDBC_4_CONNECTION_CTOR JDBC 생성자가 사용됩니다.
J DBC는 생성자는
public JDBC4Connection(String hostToConnectTo, int portToConnectTo, Properties info, String databaseToConnectTo, String url) throws SQLException { super(hostToConnectTo, portToConnectTo, info, databaseToConnectTo, url); }
찾아보세요. ConnectionImp의 생성자입니다.
(그런데: 트랜잭션의 격리 수준은 여기에서 2로 설정되고 읽기는 커밋됩니다.)
이 구성에서는 함수에서 useAffectedRows 값은 연결로 초기화됩니다.
설정할 속성은 206개이며 useAffectedRows 순위는 190위입니다(mysql-connect-java 버전에 따라 위치가 다름).
설정 완료 후:
속성 설정 후, MysqlIO 생성:
"고가용성" 옵션이 있는 경우 재시도 IO 링크가 생성됩니다. 그렇지 않으면 한 번만 시도하고 실패해도 재시도하지 않는 IO 링크를 만듭니다. 이 옵션은 autoReconnect=true를 설정하여 URL에서도 활성화됩니다.
연결 IO 프로세스는 실제로 MysqlIO를 생성한 다음 핸드셰이크를 시작하는 것입니다.
여기에 핵심 사항이 있습니다. doHandshake 메서드에서 useAffectedRows 옵션이 설정됩니다. com.mysql.jdbc.MysqlIO#doHandshake)
이 CLIENT_FOUND_ROWS의 값은
즉, 하위 비트의 끝에서 두 번째 숫자 값이 또는 작업에 사용됩니다. useAffectsRows의 경우 또는 작업이 수행되지 않습니다.
설정 후 mysqlOutput 소켓을 통해 mysql 서버로 보냅니다.
mysql출력 소스: MysqlIO가 빌드될 때 생성됩니다.
알겠습니다. 과정은 간단합니다. 다음으로 tcp 메시지를 살펴보겠습니다:
useAffectedRows=true:
mysql 서버에 요청 보내기:
mysql 서버의 응답:
useAffectedRows=false:
mysql 서버에 요청 보내기:
mysql 서버의 응답:
위 메시지에서 볼 수 있는 것은 useAffectedRows는 참이고 거짓입니다. msyql 서버의 반환 값이 다릅니다. 마지막으로 jdbc에서 얻은 반환 결과는 메시지의 Affected Rows 값입니다. msyql의 결과에서 직접 얻은 jdbc는 결과에 대해 일부 구문 분석 및 필터링을 수행합니다. 이는 초기 추측이 틀렸다는 것을 증명합니다.
추천 학습: mysql 비디오 튜토리얼
위 내용은 mysql의 업데이트 문은 무엇을 반환합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!