פקודות לניהול סשנים של JDBC‏ (GoogleSQL)

מנהל ההתקן Spanner JDBC ‏ (Java Database Connectivity) תומך בהצהרות לניהול סשנים, שמאפשרות לשנות את מצב החיבור, להריץ טרנזקציות ולהריץ ביעילות קבוצות של הצהרות.

הפקודות הבאות חלות על מסדי נתונים בניב GoogleSQL.

דוחות חיבור

ההצהרות הבאות משנות את המאפיינים של החיבור הנוכחי או מציגות אותם.

קריאה בלבד

ערך בוליאני שמציין אם החיבור נמצא במצב קריאה-בלבד. ערך ברירת המחדל הוא false.

SHOW VARIABLE READONLY
SET READONLY = { true | false }

אפשר לשנות את הערך של המאפיין הזה רק כשאין טרנזקציה פעילה.

דוגמה: עסקה עם הרשאת קריאה בלבד (יש ללחוץ כדי להרחיב את הקטע)

בדוגמה הבאה אפשר לראות איך משתמשים במאפיין הזה כדי להריץ טרנזקציות לקריאה בלבד ב-Spanner.

SET READONLY = TRUE;
-- This transaction is a read-only transaction.
BEGIN TRANSACTION;

-- The following two queries both use the read-only transaction.
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

SELECT Title
FROM Albums
ORDER BY Title;

-- This shows the read timestamp that was used for the two queries.
SHOW VARIABLE READ_TIMESTAMP;

-- This marks the end of the read-only transaction. The next statement starts
-- a new read-only transaction.
COMMIT;

AUTOCOMMIT

ערך בוליאני שמציין אם החיבור נמצא במצב אישור אוטומטי. ערך ברירת המחדל הוא true.

SHOW VARIABLE AUTOCOMMIT
SET AUTOCOMMIT = { true | false }

אפשר לשנות את הערך של הנכס הזה רק כשאין טרנזקציה פעילה.

אם הערך של AUTOCOMMIT מוגדר כ-False, מתחילה עסקה חדשה באופן אוטומטי אחרי שמריצים את הפקודות COMMIT או ROLLBACK. ההצהרה הראשונה שמבצעים מתחילה את העסקה.

דוגמה: אישור אוטומטי (אפשר ללחוץ כדי להרחיב)

בדוגמה הבאה אפשר לראות איך משתמשים במאפיין `autocommit`.

-- The default value for AUTOCOMMIT is true.
SHOW VARIABLE AUTOCOMMIT;

-- This insert statement is automatically committed after it is executed, as
-- the connection is in autocommit mode.
INSERT INTO T (id, col_a, col_b) VALUES (1, 100, 1);

-- Turning off autocommit means that a new transaction is automatically started
-- when the next statement is executed.
SET AUTOCOMMIT = FALSE;
-- The following statement starts a new transaction.
INSERT INTO T (id, col_a, col_b) VALUES (2, 200, 2);

-- This statement uses the same transaction as the previous statement.
INSERT INTO T (id, col_a, col_b) VALUES (3, 300, 3);

-- Commit the current transaction with the two INSERT statements.
COMMIT;

-- Transactions can also be executed in autocommit mode by executing the BEGIN
-- statement.
SET AUTOCOMMIT = TRUE;

-- Execute a transaction while in autocommit mode.
BEGIN;
INSERT INTO T (id, col_a, col_b) VALUES (4, 400, 4);
INSERT INTO T (id, col_a, col_b) VALUES (5, 500, 5);
COMMIT;

RETRY_ABORTS_INTERNALLY

ערך בוליאני שמציין אם המערכת מנסה אוטומטית להתחבר מחדש לעסקאות שבוטלו. ערך ברירת המחדל הוא true.

SHOW VARIABLE RETRY_ABORTS_INTERNALLY
SET RETRY_ABORTS_INTERNALLY = { true | false }

אפשר לשנות את הערך של המאפיין הזה רק אחרי שתהליך העסקה מתחיל (ראו BEGIN TRANSACTION) ולפני שמתבצעות הצהרות כלשהן במהלך העסקה.

כשמגדירים את RETRY_ABORTS_INTERNALLY כ-True, החיבור שומר את סכום הביקורת של כל הנתונים שהחיבור מחזיר לאפליקציית הלקוח. הוא משמש לניסיון חוזר של העסקה אם היא מבוטלת על ידי Spanner.

ערך ברירת המחדל הוא true. מומלץ להגדיר את הערך הזה ל-false אם האפליקציה כבר מנסה שוב לבצע עסקאות שבוטלו.

AUTOCOMMIT_DML_MODE

מאפיין STRING שמציין את מצב האישור האוטומטי של הצהרות שפת טיפול בנתונים (DML).

SHOW VARIABLE AUTOCOMMIT_DML_MODE
SET AUTOCOMMIT_DML_MODE = { 'TRANSACTIONAL' | 'PARTITIONED_NON_ATOMIC' }

הערכים האפשריים הם:

  • במצב TRANSACTIONAL, מנהל ההתקן מבצע הצהרות DML כעסקאות אטומיות נפרדות. הדרייבר יוצר טרנזקציה חדשה, מריץ את הצהרת ה-DML ומבצע commit לטרנזקציה אם ההרצה מצליחה, או מבצע rollback לטרנזקציה אם מתרחשת שגיאה.
  • במצב PARTITIONED_NON_ATOMIC, מנהל ההתקן מפעיל הצהרות DML כהצהרות עדכון מחולקות. הצהרת עדכון עם חלוקה למחיצות יכולה לפעול כסדרה של הרבה טרנזקציות, שכל אחת מהן מכסה קבוצת משנה של השורות המושפעות. ההצהרה עם המחיצות מספקת סמנטיקה מוחלשת בתמורה לשיפור ההתאמה לעומס ולביצועים.

ערך ברירת המחדל הוא TRANSACTIONAL.

דוגמה: DML עם חלוקה למחיצות (לחצו כדי להרחיב)

בדוגמה הבאה מוצג איך להריץ [Partitioned DML](/spanner/docs/dml-partitioned) באמצעות מנהל ההתקן Spanner JDBC.

-- Change autocommit DML mode to use Partitioned DML.
SET AUTOCOMMIT_DML_MODE = 'PARTITIONED_NON_ATOMIC';

-- Delete all singers that have been marked as inactive.
-- This statement is executed using Partitioned DML.
DELETE
FROM singers
WHERE active=false;

-- Change DML mode back to standard `TRANSACTIONAL`.
SET AUTOCOMMIT_DML_MODE = 'TRANSACTIONAL';

STATEMENT_TIMEOUT

מאפיין מסוג STRING שמציין את ערך הזמן הקצוב לתפוגה הנוכחי של הצהרות.

SHOW VARIABLE STATEMENT_TIMEOUT
SET STATEMENT_TIMEOUT = { '<INT64>{ s | ms | us | ns }' | NULL }

הערך INT64 הוא מספר שלם שאחריו סיומת שמציינת את יחידת הזמן. הערך NULL מציין שלא הוגדר ערך של זמן קצוב לתפוגה. אם הוגדר ערך של זמן קצוב לתפוגה של הצהרה, הצהרות שייקח להן יותר זמן מהזמן הקצוב לתפוגה שצוין יגרמו לשגיאה java.sql.SQLTimeoutException ויפסלו את העסקה.

יחידות הזמן הנתמכות הן:

  • s: שניות
  • ms: אלפיות השנייה
  • us: מיקרו-שניות
  • ns: ננו-שניות

ערך ברירת המחדל הוא NULL, כלומר לא מוגדר ערך של זמן קצוב לתפוגה.

אם מתרחש פסק זמן של הצהרה במהלך עסקה, העסקה נפסלת, כל ההצהרות הבאות בעסקה שנפסלה (חוץ מ-ROLLBACK) נכשלות, ומנהל ההתקן Spanner JDBC יוצר java.sql.SQLTimeoutException.

READ_ONLY_STALENESS

מאפיין מסוג STRING שמציין את הגדרת הטריות הנוכחית לקריאה בלבד ש-Spanner משתמש בה לעסקאות ולשאילתות לקריאה בלבד במצב AUTOCOMMIT.

SHOW VARIABLE READ_ONLY_STALENESS
SET READ_ONLY_STALENESS = staleness_type

staleness_type:

{ 'STRONG'
  | 'MIN_READ_TIMESTAMP timestamp'
  | 'READ_TIMESTAMP timestamp'
  | 'MAX_STALENESS <INT64>{ s | ms | us | ns }'
  | 'EXACT_STALENESS <INT64>{ s | ms | us | ns }' }

הערך של הנתונים המיושנים לקריאה בלבד חל על כל העסקאות הבאות לקריאה בלבד ועל כל השאילתות במצב AUTOCOMMIT.

ערך ברירת המחדל הוא STRONG.

אלה האפשרויות של חותמת הזמן:

חותמות הזמן צריכות להיות בפורמט הבא:

YYYY-[M]M-[D]DT[[H]H:[M]M:[S]S[.DDDDDD]][timezone]

יחידות הזמן הנתמכות להגדרת הערכים MAX_STALENESS ו-EXACT_STALENESS:

  • s: שניות
  • ms: אלפיות השנייה
  • us: מיקרו-שניות
  • ns: ננו-שניות

אפשר לשנות את הערך של המאפיין הזה רק כשאין טרנזקציה פעילה.

דוגמה: נתונים ישנים לקריאה בלבד (יש ללחוץ כדי להרחיב)

בדוגמה הבאה אפשר לראות איך מריצים שאילתות באמצעות ערך מותאם אישית של טריות הנתונים עם מנהל ההתקן Spanner JDBC.

-- Set the read-only staleness to MAX_STALENESS 10 seconds.
SET READ_ONLY_STALENESS = 'MAX_STALENESS 10s';

-- Execute a query in auto-commit mode. This returns results that are up to
-- 10 seconds stale.
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

-- Read-only staleness can also be applied to read-only transactions.
-- MAX_STALENESS is only allowed for queries in autocommit mode.
-- Change the staleness to EXACT_STALENESS and start a read-only transaction.
SET READ_ONLY_STALENESS = 'EXACT_STALENESS 10s';
BEGIN;
SET TRANSACTION READ ONLY;

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

SELECT Title, SingerId
FROM Albums
ORDER BY Title;

COMMIT;

-- Set the read staleness to an exact timestamp.
SET READ_ONLY_STALENESS = 'READ_TIMESTAMP 2024-01-26T10:36:00Z';

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

OPTIMIZER_VERSION

מאפיין מסוג STRING שמציין את גרסת הכלי לאופטימיזציה. הגרסה היא מספר שלם או הערך LATEST.

SHOW VARIABLE OPTIMIZER_VERSION
SET OPTIMIZER_VERSION = { 'version'|'LATEST'|'' }

הגדרת הגרסה של האופטימיזציה שתשמש לכל ההצהרות הבאות בחיבור. אם גרסת האופטימיזציה מוגדרת כ-'' (המחרוזת הריקה), מערכת Spanner משתמשת בגרסה האחרונה. אם לא מוגדרת גרסת אופטימיזציה,‏ Spanner משתמש בגרסת האופטימיזציה שמוגדרת ברמת מסד הנתונים.

ערך ברירת המחדל הוא ''.

דוגמה: גרסת הכלי לאופטימיזציה (יש ללחוץ כדי להרחיב את הקטע)

בדוגמה הבאה מוצג איך להריץ שאילתות באמצעות [גרסה ספציפית של אופטימיזציה](/spanner/docs/query-optimizer/versions) עם מנהל ההתקן Spanner JDBC.

-- Set the optimizer version to 5 and execute a query.
SET OPTIMIZER_VERSION = '5';

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

-- Execute the same query with the latest optimizer version.
SET OPTIMIZER_VERSION = 'LATEST';

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

-- Revert back to using the default optimizer version that has been set for the
-- database.
SET OPTIMIZER_VERSION = '';

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

OPTIMIZER_STATISTICS_PACKAGE

מאפיין מסוג STRING שמציין את חבילת הנתונים הסטטיסטיים הנוכחית של האופטימיזציה שבה נעשה שימוש בחיבור הזה.

SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE
SET OPTIMIZER_STATISTICS_PACKAGE = { 'package'|'' }

הגדרת חבילת נתונים סטטיסטיים של האופטימיזציה לשימוש בכל ההצהרות הבאות בחיבור. ‫<package> חייב להיות שם חבילה תקין. אם לא מוגדר חבילת נתונים סטטיסטיים של האופטימיזציה, Spanner משתמש בחבילת הנתונים הסטטיסטיים של האופטימיזציה שמוגדרת ברמת מסד הנתונים.

ערך ברירת המחדל הוא ''.

דוגמה: חבילת נתונים סטטיסטיים של כלי האופטימיזציה (יש ללחוץ כדי להרחיב את הקטע)

בדוגמה הבאה מוצגות שאילתות שמופעלות באמצעות [חבילת נתונים סטטיסטיים ספציפית של אופטימיזציה](/spanner/docs/query-optimizer/versions) עם מנהל התקן Spanner JDBC.

-- Show the available optimizer statistics packages in this database.
SELECT * FROM INFORMATION_SCHEMA.SPANNER_STATISTICS;

-- Set the optimizer statistics package and execute a query.
SET OPTIMIZER_STATISTICS_PACKAGE = 'auto_20240124_06_47_29UTC';

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

-- Execute the same query with the default optimizer statistics package.
SET OPTIMIZER_STATISTICS_PACKAGE = '';

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

RETURN_COMMIT_STATS

מאפיין מסוג BOOL שמציין אם צריך להחזיר נתונים סטטיסטיים לגבי עסקאות בחיבור הזה. כדי לראות את הנתונים הסטטיסטיים של המטלות שהוחזרו, מריצים את הפקודה SHOW VARIABLE COMMIT_RESPONSE.

SHOW VARIABLE RETURN_COMMIT_STATS
SET RETURN_COMMIT_STATS = { true | false }

ערך ברירת המחדל הוא false.

דוגמה: נתוני ביצועים של התחייבות (יש ללחוץ כדי להרחיב את הקטע)

בדוגמה הבאה אפשר לראות איך מציגים נתונים סטטיסטיים של ביצוע פעולות (commit) בעסקה באמצעות מנהל התקן Spanner JDBC.

-- Enable the returning of commit stats.
SET RETURN_COMMIT_STATS = true;

-- Execute a transaction.
BEGIN;
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1), (2, 200, 2), (3, 300, 3);
COMMIT;

-- View the commit response with the transaction statistics for the last
-- transaction that was committed.
SHOW VARIABLE COMMIT_RESPONSE;

RPC_PRIORITY

מאפיין מסוג STRING שמציין את העדיפות היחסית של בקשות Spanner. העדיפות משמשת כרמז לתזמון של Spanner, ולא מבטיחה את סדר הביצוע.

SHOW VARIABLE RPC_PRIORITY
SET RPC_PRIORITY = {'HIGH'|'MEDIUM'|'LOW'|'NULL'}

'NULL' פירושו שלא צריך לכלול רמז בבקשה.

ערך ברירת המחדל הוא 'NULL'.

אפשר גם להשתמש ברמז של הצהרה כדי לציין את העדיפות של ה-RPC:

@{RPC_PRIORITY=PRIORITY_LOW} SELECT * FROM Albums

מידע נוסף זמין במאמר Priority.

תגים

ההצהרות הבאות מנהלות תגים של בקשות ועסקאות.

STATEMENT_TAG

מאפיין מסוג STRING שמכיל את תג הבקשה של ההצהרה הבאה.

SHOW VARIABLE STATEMENT_TAG
SET STATEMENT_TAG = 'tag-name'

מגדירה את תג הבקשה עבור המשפט הבא שיבוצע. אפשר להגדיר רק תג אחד לכל הצהרה. התג לא יכול לכלול כמה הצהרות, אלא צריך להיות מוגדר לכל הצהרה בנפרד. כדי להסיר תג בקשה, צריך להגדיר אותו כמחרוזת ריקה ('').

ערך ברירת המחדל הוא ''.

אפשר להגדיר גם תגי עסקאות וגם תגי דפי תדפיס לאותו דף תדפיס.

אפשר גם להשתמש בהצעה להוספת הצהרה כדי להוסיף תג הצהרה:

@{STATEMENT_TAG='my-tag'} SELECT * FROM Albums

מידע נוסף זמין במאמר פתרון בעיות באמצעות תגי בקשות ותגי עסקאות.

דוגמה: תגי הצהרה (יש ללחוץ כדי להרחיב את הקטע)

בדוגמה הבאה מוצגות דרכים להגדרת תגי הצהרה באמצעות מנהל ההתקן Spanner JDBC.

-- Set the statement tag that should be included with the next statement.
SET STATEMENT_TAG = 'tag1';
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

-- The statement tag property is cleared after each statement execution.
SHOW VARIABLE STATEMENT_TAG;
-- Set another tag for the next statement.
SET STATEMENT_TAG = 'tag2';
SELECT Title
FROM Albums
ORDER BY Title;

-- Set a statement tag with a query hint.
@{STATEMENT_TAG = 'tag3'}
SELECT TrackNumber, Title
FROM Tracks
WHERE AlbumId=1 AND SingerId=1
ORDER BY TrackNumber;

TRANSACTION_TAG

מאפיין מסוג STRING שמכיל את תג העסקה לעסקה הבאה.

SHOW VARIABLE TRANSACTION_TAG
SET TRANSACTION_TAG = 'tag-name'

התג הזה מגדיר את תג העסקה לעסקה הנוכחית שצריך לבצע. אפשר להגדיר רק תג אחד לכל טרנזקציה. התג לא יכול לכלול כמה עסקאות, אלא צריך להיות מוגדר לכל עסקה בנפרד. כדי להסיר תג עסקה, צריך להגדיר אותו כמחרוזת ריקה (''). צריך להגדיר את תג העסקה לפני שמוציאים לפועל הצהרות בעסקה.

ערך ברירת המחדל הוא ''.

אפשר להגדיר גם תגי עסקאות וגם תגי דפי תדפיס לאותו דף תדפיס.

מידע נוסף זמין במאמר פתרון בעיות באמצעות תגי בקשות ותגי עסקאות.

דוגמה: תגי עסקאות (יש ללחוץ כדי להרחיב את הקטע)

בדוגמה הבאה מוצג אופן ההגדרה של תגי עסקאות באמצעות מנהל ההתקנים של Spanner JDBC.

BEGIN;
-- Set the transaction tag for the current transaction.
SET TRANSACTION_TAG = 'transaction-tag-1';

-- Set the statement tag that should be included with the next statement.
-- The statement will include both the statement tag and the transaction tag.
SET STATEMENT_TAG = 'select-statement';
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

-- The statement tag property is cleared after each statement execution.
SHOW VARIABLE STATEMENT_TAG;

-- Set another tag for the next statement.
SET STATEMENT_TAG = 'insert-statement';
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);

COMMIT;

-- The transaction tag property is cleared when the transaction finishes.
SHOW VARIABLE TRANSACTION_TAG;

דוחות עסקאות

ההצהרות הבאות מנהלות עסקאות ב-Spanner ומבצעות אותן.

READ_TIMESTAMP

SHOW VARIABLE READ_TIMESTAMP

הפונקציה מחזירה קבוצת תוצאות עם שורה אחת ועמודה אחת מסוג TIMESTAMP שמכילה את חותמת הזמן של הקריאה של העסקה האחרונה לקריאה בלבד. ההצהרה הזו מחזירה חותמת זמן רק אם טרנזקציה לקריאה בלבד עדיין פעילה והיא ביצעה לפחות שאילתה אחת, או מיד אחרי שטרנזקציה לקריאה בלבד מתבצעת ולפני שמתחילה טרנזקציה חדשה. אחרת, התוצאה היא NULL.

דוגמה: קריאת חותמת זמן (לחיצה להרחבה)

בדוגמה הבאה אפשר לראות איך צופים בחותמת הזמן של הקריאה האחרונה לפעולת קריאה בלבד באמצעות מנהל התקן Spanner JDBC.

-- Execute a query in autocommit mode using the default read-only staleness
-- (strong).
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

-- Show the read timestamp that was used for the previous query.
SHOW VARIABLE READ_TIMESTAMP;

-- Set a non-deterministic read-only staleness and execute the same query.
SET READ_ONLY_STALENESS = 'MAX_STALENESS 20s';

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

-- Show the read timestamp that was used for the previous query. The timestamp
-- is determined by Spanner, and is guaranteed to be no less than
-- 20 seconds stale.
SHOW VARIABLE READ_TIMESTAMP;

-- The read timestamp of a read-only transaction can also be retrieved.
SET READ_ONLY_STALENESS = 'STRONG';
BEGIN;
SET TRANSACTION READ ONLY;

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

-- Show the read timestamp of the current read-only transaction. All queries in
-- this transaction will use this read timestamp.
SHOW VARIABLE READ_TIMESTAMP;

SELECT Title
FROM Albums
ORDER BY Title;

-- The read timestamp is the same as for the previous query, as all queries in
-- the same transaction use the same read timestamp.
SHOW VARIABLE READ_TIMESTAMP;

COMMIT;

COMMIT_TIMESTAMP

SHOW VARIABLE COMMIT_TIMESTAMP

מחזירה קבוצת תוצאות עם שורה אחת ועמודה אחת מהסוג TIMESTAMP שמכילה את חותמת הזמן של השמירה של העסקה האחרונה של קריאה וכתיבה ש-Spanner ביצע. ההצהרה הזו מחזירה חותמת זמן רק כשמריצים אותה אחרי שמבצעים קומיט של טרנזקציית קריאה-כתיבה ולפני שמריצים הצהרות SELECT, DML או שינוי סכימה כלשהן. אחרת, התוצאה היא NULL.

דוגמה: חותמת זמן של ביצוע שינוי (אפשר ללחוץ כדי להרחיב)

בדוגמה הבאה אפשר לראות איך מציגים את חותמת הזמן של הקומיט האחרון לפעולת כתיבה באמצעות מנהל ההתקן Spanner JDBC.

-- Execute a DML statement.
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1), (2, 200, 2), (3, 300, 3);

-- Show the timestamp that the statement was committed.
SHOW VARIABLE COMMIT_TIMESTAMP;

COMMIT_RESPONSE

SHOW VARIABLE COMMIT_RESPONSE

מחזירה קבוצת תוצאות עם שורה אחת ושתי עמודות:

  • COMMIT_TIMESTAMP (type=TIMESTAMP) מציין מתי בוצעה העסקה האחרונה.
  • MUTATION_COUNT (type=INT64) מציין כמה שינויים בוצעו בעסקה שאושרה. הערך הזה תמיד ריק כשמריצים את הפקודה באמולטור.

מספר השינויים זמין רק אם הערך של SET RETURN_COMMIT_STATS הוגדר ל-true לפני אישור העסקה.

דוגמה: תגובת Commit (יש ללחוץ כדי להרחיב את הקטע)

בדוגמה הבאה מוצג איך לראות את התגובה של הקומיט האחרון לפעולת כתיבה באמצעות מנהל ההתקנים של Spanner JDBC.

-- Enable returning commit stats in addition to the commit timestamp.
SET RETURN_COMMIT_STATS = true;

-- Execute a DML statement.
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1), (2, 200, 2), (3, 300, 3);

-- Show the timestamp that the statement was committed.
SHOW VARIABLE COMMIT_RESPONSE;

BEGIN [TRANSACTION]

BEGIN [TRANSACTION]

מתחילים עסקה חדשה. מילת המפתח TRANSACTION היא אופציונלית.

  • משתמשים ב-COMMIT או ב-ROLLBACK כדי להפסיק עסקה.
  • אם הפעלתם את מצב AUTOCOMMIT, ההצהרה הזו מוציאה את החיבור ממצב AUTOCOMMIT באופן זמני. החיבור חוזר למצב AUTOCOMMIT כשהעסקה מסתיימת.
  • מצב העסקה נקבע לפי ההגדרה הנוכחית של READONLY לחיבור הזה. הערך הזה מוגדר באמצעות הפקודה SET READONLY = {TRUE | FALSE}.
  • אפשר לשנות את מצב העסקה על ידי הפעלת SET TRANSACTION READ ONLY או SET TRANSACTION READ WRITE ישירות אחרי הפעלת BEGIN [TRANSACTION].

אפשר להריץ את ההצהרה הזו רק כשאין טרנזקציה פעילה.

דוגמה: BEGIN TRANSACTION (אפשר ללחוץ כדי להרחיב)

בדוגמה הבאה מוצג איך להתחיל סוגים שונים של טרנזקציות באמצעות מנהל ההתקן Spanner JDBC.

-- This starts a transaction using the current defaults of this connection.
-- The value of READONLY determines whether the transaction is a
-- read-write or a read-only transaction.

BEGIN;
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);
COMMIT;

-- Set READONLY to TRUE to use read-only transactions by default.
SET READONLY=TRUE;

-- This starts a read-only transaction.
BEGIN;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
COMMIT;

-- Execute 'SET TRANSACTION READ WRITE' or 'SET TRANSACTION READ ONLY' directly
-- after the BEGIN statement to override the current default of the connection.
SET READONLY=FALSE;
BEGIN;
SET TRANSACTION READ ONLY;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
COMMIT;

COMMIT [TRANSACTION]

COMMIT [TRANSACTION]

מאשרים את העסקה הנוכחית. מילת המפתח TRANSACTION היא אופציונלית.

  • כשמבצעים קומיט של טרנזקציית קריאה-כתיבה, כל העדכונים של הטרנזקציה הזו נראים לטרנזקציות אחרות, וכל הנעילות של הטרנזקציה ב-Spanner משתחררות.
  • ביצוע של טרנזקציה לקריאה בלבד מסיים את הטרנזקציה הנוכחית לקריאה בלבד. כל הצהרה הבאה מתחילה עסקה חדשה. אין הבדל סמנטי בין COMMIT לבין ROLLBACK בעסקה לקריאה בלבד.

אפשר להריץ את ההצהרה הזו רק בזמן שמתבצעת טרנזקציה פעילה.

דוגמה: COMMIT TRANSACTION (לחצו להרחבה)

בדוגמה הבאה אפשר לראות איך לבצע טרנזקציה באמצעות מנהל ההתקן Spanner JDBC.

-- Execute a regular read-write transaction.
BEGIN;
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);
COMMIT;

-- Execute a read-only transaction. Read-only transactions also need to be
-- either committed or rolled back in the Spanner JDBC driver in order
-- to mark the end of the transaction.
BEGIN;
SET TRANSACTION READ ONLY;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
COMMIT;

ROLLBACK [TRANSACTION]

ROLLBACK [TRANSACTION]

מבצע ROLLBACK של העסקה הנוכחית. מילת המפתח TRANSACTION היא אופציונלית.

  • ביצוע ROLLBACK של עסקה עם הרשאות קריאה וכתיבה מנקה את כל המוטציות שנשמרו במאגר, מבטל את העסקה ב-Spanner ומשחרר את כל הנעילות שהעסקה החזיקה.
  • ביצוע ROLLBACK של טרנזקציה לקריאה בלבד מסיים את הטרנזקציה הנוכחית לקריאה בלבד. כל תדפיס הבא יתחיל עסקה חדשה. אין הבדל סמנטי בין COMMIT לבין ROLLBACK בעסקת קריאה בלבד בחיבור.

אפשר להריץ את ההצהרה הזו רק בזמן שמתבצעת טרנזקציה פעילה.

דוגמה: ROLLBACK TRANSACTION (לחצו להרחבה)

בדוגמה הבאה אפשר לראות איך מבטלים טרנזקציה באמצעות מנהל ההתקנים של Spanner JDBC.

-- Use ROLLBACK to undo the effects of a transaction.
BEGIN;
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);
-- This ensures that the insert statement is not persisted in the database.
ROLLBACK;

-- Read-only transactions also need to be either committed or rolled back in the
-- Spanner JDBC driver in order to mark the end of the transaction.
-- There is no semantic difference between rolling back or committing a
-- read-only transaction.
BEGIN;
SET TRANSACTION READ ONLY;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
ROLLBACK;

SET TRANSACTION

SET TRANSACTION { READ ONLY | READ WRITE }

הפרמטר הזה מגדיר את מצב העסקה עבור העסקה הנוכחית.

אפשר להריץ את ההצהרה הזו רק אם AUTOCOMMIT הוא false, או אם התחלתם טרנזקציה על ידי הרצת BEGIN [TRANSACTION] ועדיין לא הרצתם הצהרות בטרנזקציה.

ההצהרה הזו מגדירה את מצב העסקה רק לעסקה הנוכחית. כשהעסקה מתבצעת או מבוטלת, העסקה הבאה משתמשת במצב ברירת המחדל של החיבור (ראו SET READONLY).

דוגמה: SET TRANSACTION (אפשר ללחוץ כדי להרחיב)

בדוגמה הבאה מוצג איך מגדירים מאפייני טרנזקציה באמצעות מנהל ההתקן Spanner JDBC.

-- Start a transaction and set the transaction mode to read-only.
BEGIN;
SET TRANSACTION READ ONLY;

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

-- Commit the read-only transaction to mark the end of the transaction.
COMMIT;

-- Start a transaction and set the transaction mode to read-write.
BEGIN;
SET TRANSACTION READ WRITE;

INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);

COMMIT;

דוחות באצווה

ההצהרות הבאות מנהלות קבוצות של הצהרות DDL ושולחות את הקבוצות האלה ל-Spanner.

START BATCH DDL

START BATCH DDL

מתחילים קבוצה של הצהרות DDL בחיבור. כל ההצהרות הבאות במהלך העיבוד של הקבוצה חייבות להיות הצהרות DDL. הצהרות ה-DDL נשמרות בזיכרון המטמון באופן מקומי ונשלחות ל-Spanner כקבוצה אחת כשמריצים את RUN BATCH. בדרך כלל, ביצוע של כמה הצהרות DDL כאצווה אחת מהיר יותר מביצוע של ההצהרות בנפרד.

אפשר להריץ את ההצהרה הזו רק כשאין טרנזקציה פעילה.

דוגמה: חבילת DDL (אפשר ללחוץ כדי להרחיב)

בדוגמה הבאה אפשר לראות איך להריץ חבילת DDL באמצעות מנהל ההתקן Spanner JDBC.

-- Start a DDL batch. All following statements must be DDL statements.
START BATCH DDL;

-- This statement is buffered locally until RUN BATCH is executed.
CREATE TABLE Singers (
  SingerId  INT64 NOT NULL,
  FirstName STRING(MAX),
  LastName  STRING(MAX)
) PRIMARY KEY (SingerId);

-- This statement is buffered locally until RUN BATCH is executed.
CREATE TABLE Albums (
  AlbumId  INT64 NOT NULL,
  Title    STRING(MAX),
  SingerId INT64,
  CONSTRAINT fk_albums_singers FOREIGN KEY (SingerId) REFERENCES Singers (SingerId)
) PRIMARY KEY (AlbumId);

-- This runs the DDL statements as one batch.
RUN BATCH;

RUN BATCH

RUN BATCH

שולחת את כל הצהרות ה-DDL שנמצאות במאגר הזמני של חבילת ה-DDL הנוכחית למסד הנתונים, ממתינה עד ש-Spanner יבצע את ההצהרות האלה ומסיימת את חבילת ה-DDL הנוכחית.

אם Spanner לא יכול להריץ לפחות הצהרת DDL אחת, הפונקציה RUN BATCH מחזירה שגיאה עבור הצהרת ה-DDL הראשונה ש-Spanner לא יכול להריץ. אחרת, הפקודה RUN BATCH מוחזרת בהצלחה.

ABORT BATCH [TRANSACTION]

מנקה את כל הצהרות ה-DDL שנמצאות בבאפר באוסף הנוכחי של הצהרות DDL ומסיים את האוסף.

אפשר להריץ את ההצהרה הזו רק כשקבוצת DDL פעילה. אפשר להשתמש ב-ABORT BATCH גם אם יש או אין הצהרות DDL במאגר הזמני של החבילה. כל הצהרות ה-DDL הקודמות באצווה יבוטלו.

דוגמה: ביטול של קבוצת פקודות DDL (לחצו להרחבה)

בדוגמה הבאה אפשר לראות איך מבטלים חבילת DDL באמצעות מנהל התקן Spanner JDBC.

-- Start a DDL batch. All following statements must be DDL statements.
START BATCH DDL;

-- The following statements are buffered locally.
CREATE TABLE Singers (
  SingerId  INT64 NOT NULL,
  FirstName STRING(MAX),
  LastName  STRING(MAX)
) PRIMARY KEY (SingerId);

CREATE TABLE Albums (
  AlbumId  INT64 NOT NULL,
  Title    STRING(MAX),
  SingerId INT64,
  CONSTRAINT fk_albums_singers FOREIGN KEY (SingerId) REFERENCES Singers (SingerId)
) PRIMARY KEY (AlbumId);

-- This aborts the DDL batch and removes the DDL statements from the buffer.
ABORT BATCH;

START BATCH DML and RUN Batch

ההצהרות הבאות מקבצות את שתי הצהרות ה-DML ושולחות אותן בקריאה אחת לשרת. אפשר להריץ קבוצת פקודות DML כחלק מעסקה או במצב אישור אוטומטי.

START BATCH DML;
INSERT INTO MYTABLE (ID, NAME) VALUES (1, 'ONE');
INSERT INTO MYTABLE (ID, NAME) VALUES (2, 'TWO');
RUN BATCH;
דוגמה: קבוצת פקודות DML (לחצו להרחבה)

בדוגמה הבאה אפשר לראות איך להריץ חבילת DML באמצעות מנהל ההתקן Spanner JDBC.

-- Start a DML batch. All following statements must be a DML statement.
START BATCH DML;

-- The following statements are buffered locally.
INSERT INTO MYTABLE (ID, NAME) VALUES (1, 'ONE');
INSERT INTO MYTABLE (ID, NAME) VALUES (2, 'TWO');

-- This sends the statements to Spanner.
RUN BATCH;

-- DML batches can also be part of a read/write transaction.
BEGIN;
-- Insert a row using a single statement.
INSERT INTO MYTABLE (ID, NAME) VALUES (3, 'THREE');

-- Insert two rows using a batch.
START BATCH DML;
INSERT INTO MYTABLE (ID, NAME) VALUES (4, 'FOUR');
INSERT INTO MYTABLE (ID, NAME) VALUES (5, 'FIVE');
RUN BATCH;

-- Rollback the current transaction. This rolls back both the single DML
-- statement and the DML batch.
ROLLBACK;

הצהרות של שאילתות עם מחיצות ו-Data Boost

ממשק ה-API‏ partitionQuery מחלק שאילתה לחלקים קטנים יותר, או למחיצות, ומשתמש בכמה מכונות כדי לאחזר את המחיצות במקביל. כל מחיצה מזוהה באמצעות אסימון מחיצה. החביון של PartitionQuery API גבוה יותר מזה של API רגיל לשאילתות, כי הוא מיועד רק לפעולות בכמות גדולה, כמו ייצוא או סריקה של כל מסד הנתונים.

Data Boost for Spanner מאפשר לכם להריץ שאילתות ניתוח ולייצא נתונים עם השפעה כמעט אפסית על עומסי העבודה הקיימים במופע Spanner שהוקצה. Data Boost תומך רק בשאילתות עם חלוקה למחיצות.

אפשר להפעיל את התכונה 'הגדלת נפח הנתונים' באמצעות ההצהרה SET DATA_BOOST_ENABLED.

מנהל ההתקן Spanner JDBC תומך בשלוש חלופות להרצת שאילתות מחולקות:

  • SET AUTO_PARTITION_MODE = true
  • RUN PARTITIONED QUERY sql
  • PARTITION sql ואחריו כמה RUN PARTITION 'partition-token'

כל אחת מהשיטות האלה מתוארת בקטעים הבאים.

DATA_BOOST_ENABLED

מאפיין מסוג BOOL שמציין אם החיבור הזה צריך להשתמש בData Boost לשאילתות עם חלוקה למחיצות. ברירת המחדל היא false.

SHOW VARIABLE DATA_BOOST_ENABLED
SET DATA_BOOST_ENABLED = { true | false }
דוגמה: הפעלת שאילתה באמצעות Data Boost (לחיצה להרחבה)

בדוגמה הבאה מוצגת שאילתה באמצעות Data Boost עם מנהל ההתקן Spanner JDBC.

-- Enable Data Boost on this connection.
SET DATA_BOOST_ENABLED = true;

-- Execute a partitioned query. Data Boost is only used for partitioned queries.
RUN PARTITIONED QUERY SELECT FirstName, LastName FROM Singers;

דוגמה מלאה מופיעה במאמר DataBoostExample.

AUTO_PARTITION_MODE

מאפיין מסוג BOOL שמציין אם החיבור משתמש אוטומטית בשאילתות מחולקות לכל השאילתות שמופעלות.

SHOW VARIABLE AUTO_PARTITION_MODE
SET AUTO_PARTITION_MODE = { true | false}
  • מגדירים את המשתנה הזה לערך true אם רוצים שהחיבור ישתמש בשאילתה עם חלוקה למחיצות לכל השאילתות שמופעלות.
  • אם רוצים שהחיבור ישתמש ב-Data Boost לכל השאילתות, צריך להגדיר את DATA_BOOST_ENABLED ל-true.

ערך ברירת המחדל הוא false.

דוגמה: הפעלה (לחיצה להרחבה)

בדוגמה הזו מופעלות שתי שאילתות באמצעות מנהל ההתקן Spanner JDBC, תוך שימוש ב-Data Boost.

SET AUTO_PARTITION_MODE = true
SET DATA_BOOST_ENABLED = true
SELECT FirstName, LastName FROM Singers
SELECT SingerId, Title FROM Albums

דוגמה מלאה מופיעה במאמר בנושא AutoPartitionModeExample.

הפעלת שאילתה עם חלוקה למחיצות

RUN PARTITIONED QUERY <sql>

מריץ שאילתה כשאילתה מחולקת ב-Spanner. כדי להריץ את השאילתה עם Data Boost, צריך לוודא שהערך של DATA_BOOST_ENABLED הוא true:

SET DATA_BOOST_ENABLED = true
RUN PARTITIONED QUERY SELECT FirstName, LastName FROM Singers

מנהל ההתקן של Spanner JDBC מחלק את השאילתה באופן פנימי ומבצע את החלוקות במקביל. התוצאות ממוזגות לקבוצת תוצאות אחת ומוחזרות לאפליקציה. אפשר להגדיר את מספר ה-worker threads שמבצעים חלוקות באמצעות המשתנה MAX_PARTITIONED_PARALLELISM.

דוגמה מלאה מופיעה במאמר RunPartitionedQueryExample.

PARTITION <SQL>

PARTITION <sql>

יוצר רשימה של מחיצות להרצת שאילתה ב-Spanner ומחזיר רשימה של טוקנים של מחיצות. אפשר להריץ כל אסימון של מחיצה בחיבור נפרד באותו לקוח או בלקוח אחר באמצעות הפקודה RUN PARTITION 'partition-token'.

דוגמה: שאילתת חלוקה (צריך ללחוץ כדי להרחיב)

בדוגמה הבאה מוצג אופן החלוקה של שאילתה למחיצות, ולאחר מכן הפעלה של כל מחיצה בנפרד באמצעות מנהל התקן Spanner JDBC.

-- Partition a query. This returns a list of partition tokens that can be
-- executed either on this connection or on any other connection to the same
-- database.
PARTITION SELECT FirstName, LastName FROM Singers;

-- Run the partitions that were returned from the previous statement.
RUN PARTITION 'partition-token-1';
RUN PARTITION 'partition-token-2';

דוגמה מלאה מופיעה במאמר בנושא PartitionQueryExample.

RUN PARTITION 'partition-token'

RUN PARTITION 'partition-token'

מריץ חלוקה של שאילתה שהוחזרה קודם על ידי הפקודה PARTITION. אפשר להריץ את הפקודה בכל חיבור שמחובר לאותו מסד נתונים שבו נוצרו אסימוני החלוקה.

MAX_PARTITIONED_PARALLELISM

מאפיין מסוג INT64 שמציין את מספר ה-worker threads שמשמשים את מנהל ההתקן של Spanner JDBC להפעלת מחיצות. הערך הזה משמש ל:

  • AUTO_PARTITION_MODE = true
  • RUN PARTITIONED QUERY sql
SHOW VARIABLE MAX_PARTITIONED_PARALLELISM
SET MAX_PARTITIONED_PARALLELISM = <INT64>

מגדיר את המספר המקסימלי של שרשורי עבודה שמנהל ההתקן של Spanner JDBC יכול להשתמש בהם כדי להפעיל מחיצות. הגדרת הערך הזה ל-0 מורה לדרייבר Spanner JDBC להשתמש במספר ליבות ה-CPU במכונת הלקוח כערך המקסימלי.

ערך ברירת המחדל הוא 0.

הצהרות קריאה שהופנו

מאפיין מסוג STRING שמגדיר את אפשרות הקריאה המכוונת עבור ההצהרות הבאות.

SHOW VARIABLE DIRECTED_READ
SET DIRECTED_READ='{"includeReplicas":{"replicaSelections":[{"location":"<location-name>"}]}}'

מידע נוסף זמין במאמר בנושא קריאות מונחות.

פקודות של נקודות שמירה

ההצהרות הבאות מפעילות או משביתות נקודות שמירה מדומה בעסקאות. כדי ליצור נקודת שמירה, קוראים לשיטה java.sql.Connection#setSavepoint().

מנהל ההתקן Spanner JDBC מדמה נקודות שמירה כדי לתמוך במסגרות שמסתמכות על נקודות שמירה עבור טרנזקציות מקוננות. נקודות השמירה מודמות על ידי מעקב אחרי סכום ביקורת רץ של התוצאות שהוחזרו על ידי הצהרות בעסקה. כשמבצעים Rollback לנקודת שמירה, מנהל ההתקן של Spanner JDBC מבצע Rollback לעסקה, ואז מנסה שוב את העסקה עד לנקודה שבה נקבעה נקודת השמירה. סכום הביקורת של הניסיון החוזר מושווה לסכום הביקורת של העסקה הראשונית כדי לוודא שהתוצאות זהות.

SAVEPOINT_SUPPORT

SHOW VARIABLE SAVEPOINT_SUPPORT
SET SAVEPOINT_SUPPORT = { 'DISABLED' | 'FAIL_AFTER_ROLLBACK' | 'ENABLED' }

מאפיין מסוג STRING שמציין את ההגדרה הנוכחית של SAVEPOINT_SUPPORT הנכס. הערכים שאפשר לבחור הם:

  • DISABLED: כל הפקודות של נקודות השמירה מושבתות וייכשלו.
  • FAIL_AFTER_ROLLBACK: פקודות Savepoint מופעלות. ביטול שינויים עד לנקודת שמירה מבטל את כל השינויים בעסקה. העסקה תיכשל אם תנסו להשתמש בה אחרי ביטול השינויים עד לנקודת השמירה.
  • ENABLED: כל הפקודות של נקודות השמירה מופעלות. חזרה לנקודת שמירה תבטל את הטרנזקציה ותנסה שוב לבצע אותה עד לנקודת השמירה. הפעולה הזו נכשלת עם שגיאה AbortedDueToConcurrentModificationException אם נתוני הבסיס ששימשו את העסקה עד לנקודת השמירה השתנו.

ערך ברירת המחדל הוא FAIL_AFTER_ROLLBACK.

אפשר לשנות את הערך של המשתנה הזה רק כשאין טרנזקציה פעילה.

דוגמה: תמיכה בנקודות שמירה (יש ללחוץ כדי להרחיב את הקטע)

בדוגמה הבאה אפשר לראות איך מפעילים ומשביתים תמיכה בנקודות שמירה במנהל ההתקן Spanner JDBC.

try (Connection connection =
    DriverManager.getConnection(
        String.format(
            "jdbc:cloudspanner:/projects/%s/instances/%s/databases/%s",
            "my-project", "my-instance", "my-database"))) {
  // Savepoints can only be used when AutoCommit=false.
  connection.setAutoCommit(false);

  // Disables setting a savepoint.
  connection.createStatement().execute("SET SAVEPOINT_SUPPORT='DISABLED'");
  // The following statement fails because savepoints have been disabled.
  connection.setSavepoint("my_savepoint1");

  // Enables setting a savepoint and releasing a savepoint.
  // Rolling back to a savepoint is disabled.
  connection.createStatement().execute("SET SAVEPOINT_SUPPORT='FAIL_AFTER_ROLLBACK'");
  Savepoint mySavepoint2 = connection.setSavepoint("my_savepoint2");
  connection.createStatement().execute("insert into my_table (id, value) values (1, 'One')");
  connection.releaseSavepoint(mySavepoint2);
  connection.commit();

  // Enables setting, releasing and rolling back to a savepoint.
  connection.createStatement().execute("SET SAVEPOINT_SUPPORT='ENABLED'");
  Savepoint mySavepoint3 = connection.setSavepoint("my_savepoint3");
  connection.createStatement().execute("insert into my_table (id, value) values (2, 'Two')");
  connection.rollback(mySavepoint3);
}

המאמרים הבאים

איך מחברים JDBC למסד נתונים של ניב GoogleSQL