מנהל ההתקן Spanner JDBC (Java Database Connectivity) תומך בהצהרות לניהול סשנים, שמאפשרות לשנות את מצב החיבור, להריץ טרנזקציות ולהריץ ביעילות קבוצות של הצהרות.
הפקודות הבאות חלות על מסדי נתונים בניב PostgreSQL.
דוחות חיבור
ההצהרות הבאות משנות את המאפיינים של החיבור הנוכחי או מציגות אותם.
SPANNER.READONLY
ערך בוליאני שמציין אם החיבור נמצא במצב קריאה-בלבד. ערך ברירת המחדל הוא false.
SHOW [VARIABLE] SPANNER.READONLY
SET SPANNER.READONLY {TO|=} { true | false }
אפשר לשנות את הערך של המאפיין הזה רק כשאין טרנזקציה פעילה.
דוגמה: עסקה עם הרשאת קריאה בלבד (יש ללחוץ כדי להרחיב את הקטע)
בדוגמה הבאה אפשר לראות איך משתמשים במאפיין הזה כדי להריץ טרנזקציות לקריאה בלבד ב-Spanner.
SET SPANNER.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 SPANNER.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 {TO|=} { true | false }
אפשר לשנות את הערך של הנכס הזה רק כשאין טרנזקציה פעילה.
אם הערך של AUTOCOMMIT מוגדר כ-False, מתחילה עסקה חדשה באופן אוטומטי אחרי שמריצים את הפקודות COMMIT או ROLLBACK. ההצהרה הראשונה שמבצעים מתחילה את העסקה.
דוגמה: אישור אוטומטי (אפשר ללחוץ כדי להרחיב)
בדוגמה הבאה אפשר לראות איך משתמשים במאפיין `autocommit`.
-- The default value for AUTOCOMMIT is true. SHOW 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 = FALSE; -- 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;
SPANNER.RETRY_ABORTS_INTERNALLY
ערך בוליאני שמציין אם המערכת מנסה אוטומטית להתחבר מחדש לעסקאות שבוטלו. ערך ברירת המחדל הוא true.
SHOW [VARIABLE] SPANNER.RETRY_ABORTS_INTERNALLY
SET SPANNER.RETRY_ABORTS_INTERNALLY {TO|=} { true | false }
אפשר לשנות את הערך של המאפיין הזה רק אחרי שתהליך העסקה מתחיל (ראו BEGIN TRANSACTION) ולפני שמתבצעות הצהרות כלשהן במהלך העסקה.
כשמגדירים את SPANNER.RETRY_ABORTS_INTERNALLY כ-True, החיבור שומר את סכום הביקורת של כל הנתונים שהחיבור מחזיר לאפליקציית הלקוח. הוא משמש לניסיון חוזר של העסקה אם היא מבוטלת על ידי Spanner.
ערך ברירת המחדל הוא true. מומלץ להגדיר את הערך הזה ל-false אם האפליקציה כבר מנסה שוב לבצע עסקאות שבוטלו.
SPANNER.AUTOCOMMIT_DML_MODE
מאפיין STRING שמציין את מצב האישור האוטומטי של הצהרות שפת טיפול בנתונים (DML).
SHOW [VARIABLE] SPANNER.AUTOCOMMIT_DML_MODE
SET SPANNER.AUTOCOMMIT_DML_MODE {TO|=} { '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 SPANNER.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 SPANNER.AUTOCOMMIT_DML_MODE = 'TRANSACTIONAL';
STATEMENT_TIMEOUT
מאפיין מסוג STRING שמציין את ערך הזמן הקצוב לתפוגה הנוכחי של הצהרות.
SHOW [VARIABLE] STATEMENT_TIMEOUT
SET STATEMENT_TIMEOUT {TO|=} { '<int8>{ s | ms | us | ns }' | <int8> | DEFAULT }
הערך int8 הוא מספר שלם שאחריו סיומת שמציינת את יחידת הזמן. DEFAULT פירושו 0 שניות, שזה שווה ערך לאי-הגדרה של זמן קצוב לתפוגה. מספר int8 ללא יחידות מציין אלפיות השנייה. אם הוגדר ערך של זמן קצוב לתפוגה של הצהרה, הצהרות שייקח להן יותר זמן מהערך שצוין לזמן הקצוב לתפוגה יגרמו לשגיאה java.sql.SQLTimeoutException ויפסלו את העסקה.
יחידות הזמן הנתמכות הן:
-
s: שניות -
ms: אלפיות השנייה -
us: מיקרו-שניות -
ns: ננו-שניות
ערך ברירת המחדל הוא 0, כלומר אין זמן קצוב לתפוגה.
אם מתרחש פסק זמן של הצהרה במהלך עסקה, העסקה נפסלת, כל ההצהרות הבאות בעסקה שנפסלה (חוץ מ-ROLLBACK) נכשלות, ומנהל ההתקן Spanner JDBC יוצר java.sql.SQLTimeoutException.
SPANNER.READ_ONLY_STALENESS
מאפיין מסוג STRING שמציין את הגדרת הטריות הנוכחית לקריאה בלבד ש-Spanner משתמש בה לעסקאות ולשאילתות לקריאה בלבד במצב AUTOCOMMIT.
SHOW [VARIABLE] SPANNER.READ_ONLY_STALENESS
SET SPANNER.READ_ONLY_STALENESS {TO|=} staleness_type
staleness_type:
{ 'STRONG'
| 'MIN_READ_TIMESTAMP timestamp'
| 'READ_TIMESTAMP timestamp'
| 'MAX_STALENESS <int8>{ s | ms | us | ns }'
| 'EXACT_STALENESS <int8>{ s | ms | us | ns }' }
הערך של הנתונים המיושנים לקריאה בלבד חל על כל העסקאות הבאות לקריאה בלבד ועל כל השאילתות במצב AUTOCOMMIT.
ערך ברירת המחדל הוא STRONG.
אלה האפשרויות של חותמת הזמן:
-
STRONGאומר ל-Spanner לבצע קריאה חזקה. -
MAX_STALENESSמגדיר את מרווח הזמן שבו Spanner משתמש כדי לבצע קריאה עם חוסר עדכניות מוגבל, ביחס ל-now(). -
MIN_READ_TIMESTAMPמגדיר זמן מוחלט שבו Spanner משתמש כדי לבצע קריאה עם רמת עדכניות מוגבלת. -
EXACT_STALENESSמגדיר את מרווח הזמן שבו Spanner משתמש כדי לבצע קריאה מדויקת של נתונים לא עדכניים, ביחס ל-now(). -
READ_TIMESTAMPמגדיר זמן מוחלט שמשמש את Spanner כדי לבצע קריאה מדויקת של נתונים ישנים.
חותמות הזמן צריכות להיות בפורמט הבא:
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 SPANNER.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 SPANNER.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 SPANNER.READ_ONLY_STALENESS = 'READ_TIMESTAMP 2024-01-26T10:36:00Z'; SELECT FirstName, LastName FROM Singers ORDER BY LastName;
SPANNER.OPTIMIZER_VERSION
מאפיין מסוג STRING שמציין את גרסת הכלי לאופטימיזציה. הגרסה היא מספר שלם או הערך LATEST.
SHOW [VARIABLE] SPANNER.OPTIMIZER_VERSION
SET SPANNER.OPTIMIZER_VERSION {TO|=} { 'version'|'LATEST'|'' }
הגדרת הגרסה של האופטימיזציה שתשמש לכל ההצהרות הבאות בחיבור. אם גרסת האופטימיזציה מוגדרת כ-'' (המחרוזת הריקה), מערכת Spanner משתמשת בגרסה האחרונה. אם לא מוגדרת גרסת אופטימיזציה, Spanner משתמש בגרסת האופטימיזציה שמוגדרת ברמת מסד הנתונים.
ערך ברירת המחדל הוא ''.
דוגמה: גרסת הכלי לאופטימיזציה (יש ללחוץ כדי להרחיב את הקטע)
בדוגמה הבאה מוצג איך להריץ שאילתות באמצעות [גרסה ספציפית של אופטימיזציה](/spanner/docs/query-optimizer/versions) עם מנהל ההתקן Spanner JDBC.
-- Set the optimizer version to 5 and execute a query. SET SPANNER.OPTIMIZER_VERSION = '5'; SELECT FirstName, LastName FROM Singers ORDER BY LastName; -- Execute the same query with the latest optimizer version. SET SPANNER.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 SPANNER.OPTIMIZER_VERSION = ''; SELECT FirstName, LastName FROM Singers ORDER BY LastName;
SPANNER.OPTIMIZER_STATISTICS_PACKAGE
מאפיין מסוג STRING שמציין את חבילת הנתונים הסטטיסטיים הנוכחית של האופטימיזציה שבה נעשה שימוש בחיבור הזה.
SHOW [VARIABLE] SPANNER.OPTIMIZER_STATISTICS_PACKAGE
SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE {TO|=} { '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 SPANNER.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 SPANNER.OPTIMIZER_STATISTICS_PACKAGE = ''; SELECT FirstName, LastName FROM Singers ORDER BY LastName;
SPANNER.RETURN_COMMIT_STATS
מאפיין מסוג BOOL שמציין אם צריך להחזיר נתונים סטטיסטיים לגבי עסקאות בחיבור הזה. כדי לראות את הנתונים הסטטיסטיים של המטלות שהוחזרו, מריצים את הפקודה SHOW SPANNER.COMMIT_RESPONSE.
SHOW [VARIABLE] SPANNER.RETURN_COMMIT_STATS
SET SPANNER.RETURN_COMMIT_STATS {TO|=} { true | false }
ערך ברירת המחדל הוא false.
דוגמה: נתוני ביצועים של התחייבות (יש ללחוץ כדי להרחיב את הקטע)
בדוגמה הבאה אפשר לראות איך מציגים נתונים סטטיסטיים של ביצוע פעולות (commit) בעסקה באמצעות מנהל התקן Spanner JDBC.
-- Enable the returning of commit stats. SET SPANNER.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 SPANNER.COMMIT_RESPONSE;
SPANNER.RPC_PRIORITY
מאפיין מסוג STRING שמציין את העדיפות היחסית של בקשות Spanner. העדיפות משמשת כרמז לתזמון של Spanner, ולא מבטיחה את סדר הביצוע.
SHOW [VARIABLE] SPANNER.RPC_PRIORITY
SET SPANNER.RPC_PRIORITY = {'HIGH'|'MEDIUM'|'LOW'|'NULL'}
'NULL' פירושו שלא צריך לכלול רמז בבקשה.
ערך ברירת המחדל הוא 'NULL'.
אפשר גם להשתמש ברמז של הצהרה כדי לציין את העדיפות של ה-RPC:
/*@RPC_PRIORITY=PRIORITY_LOW*/ SELECT * FROM Albums
מידע נוסף זמין במאמר Priority.
תגים
ההצהרות הבאות מנהלות תגים של בקשות ועסקאות.
SPANNER.STATEMENT_TAG
מאפיין מסוג STRING שמכיל את תג הבקשה של ההצהרה הבאה.
SHOW [VARIABLE] SPANNER.STATEMENT_TAG
SET SPANNER.STATEMENT_TAG {TO|=} 'tag-name'
מגדירה את תג הבקשה עבור המשפט הבא שיבוצע. אפשר להגדיר רק תג אחד לכל הצהרה. התג לא יכול לכלול כמה הצהרות, אלא צריך להיות מוגדר לכל הצהרה בנפרד. כדי להסיר תג בקשה, צריך להגדיר אותו כמחרוזת ריקה ('').
ערך ברירת המחדל הוא ''.
אפשר להגדיר גם תגי עסקאות וגם תגי דפי תדפיס לאותו דף תדפיס.
אפשר גם להשתמש בהצעה להוספת הצהרה כדי להוסיף תג הצהרה:
/*@STATEMENT_TAG='my-tag'*/ SELECT * FROM Albums
מידע נוסף זמין במאמר פתרון בעיות באמצעות תגי בקשות ותגי עסקאות.
דוגמה: תגי הצהרה (יש ללחוץ כדי להרחיב את הקטע)
בדוגמה הבאה מוצגות דרכים להגדרת תגי הצהרה באמצעות מנהל ההתקן Spanner JDBC.
-- Set the statement tag that should be included with the next statement. SET SPANNER.STATEMENT_TAG = 'tag1'; SELECT FirstName, LastName FROM Singers ORDER BY LastName; -- The statement tag property is cleared after each statement execution. SHOW SPANNER.STATEMENT_TAG; -- Set another tag for the next statement. SET SPANNER.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;
SPANNER.TRANSACTION_TAG
מאפיין מסוג STRING שמכיל את תג העסקה לעסקה הבאה.
SHOW [VARIABLE] SPANNER.TRANSACTION_TAG
SET SPANNER.TRANSACTION_TAG {TO|=} 'tag-name'
התג הזה מגדיר את תג העסקה לעסקה הנוכחית שצריך לבצע. אפשר להגדיר רק תג אחד לכל טרנזקציה. התג לא יכול לכלול כמה עסקאות, אלא צריך להיות מוגדר לכל עסקה בנפרד. כדי להסיר תג עסקה, צריך להגדיר אותו כמחרוזת ריקה (''). צריך להגדיר את תג העסקה לפני שמתבצעות הצהרות בעסקה.
ערך ברירת המחדל הוא ''.
אפשר להגדיר גם תגי עסקאות וגם תגי דפי תדפיס לאותו דף תדפיס.
מידע נוסף זמין במאמר פתרון בעיות באמצעות תגי בקשות ותגי עסקאות.
דוגמה: תגי עסקאות (יש ללחוץ כדי להרחיב את הקטע)
בדוגמה הבאה מוצג אופן ההגדרה של תגי עסקאות באמצעות מנהל ההתקנים של Spanner JDBC.
BEGIN; -- Set the transaction tag for the current transaction. SET SPANNER.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 SPANNER.STATEMENT_TAG = 'select-statement'; SELECT FirstName, LastName FROM Singers ORDER BY LastName; -- The statement tag property is cleared after each statement execution. SHOW SPANNER.STATEMENT_TAG; -- Set another tag for the next statement. SET SPANNER.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 SPANNER.TRANSACTION_TAG;
דוחות עסקאות
ההצהרות הבאות מנהלות עסקאות ב-Spanner ומבצעות אותן.
רמת הבידוד של טרנזקציה
SHOW [VARIABLE] TRANSACTION ISOLATION LEVEL
הפונקציה מחזירה קבוצת תוצאות עם שורה אחת ועמודה אחת מהסוג STRING. הערך שמוחזר הוא תמיד serializable.
SPANNER.READ_TIMESTAMP
SHOW [VARIABLE] SPANNER.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 SPANNER.READ_TIMESTAMP; -- Set a non-deterministic read-only staleness and execute the same query. SET SPANNER.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 SPANNER.READ_TIMESTAMP; -- The read timestamp of a read-only transaction can also be retrieved. SET SPANNER.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 SPANNER.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 SPANNER.READ_TIMESTAMP; COMMIT;
SPANNER.COMMIT_TIMESTAMP
SHOW [VARIABLE] SPANNER.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 SPANNER.COMMIT_TIMESTAMP;
SPANNER.COMMIT_RESPONSE
SHOW [VARIABLE] SPANNER.COMMIT_RESPONSE
מחזירה קבוצת תוצאות עם שורה אחת ושתי עמודות:
-
COMMIT_TIMESTAMP(type=TIMESTAMP) מציין מתי בוצעה העסקה האחרונה. -
MUTATION_COUNT(type=INT64) מציין כמה שינויים בוצעו בעסקה שאושרה. הערך הזה תמיד ריק כשמריצים את הפקודה באמולטור.
מספר השינויים זמין רק אם הערך של SET SPANNER.RETURN_COMMIT_STATS הוגדר ל-true לפני אישור העסקה.
דוגמה: תגובת Commit (יש ללחוץ כדי להרחיב את הקטע)
בדוגמה הבאה מוצג איך לראות את התגובה של הקומיט האחרון לפעולת כתיבה באמצעות מנהל ההתקנים של Spanner JDBC.
-- Enable returning commit stats in addition to the commit timestamp. SET SPANNER.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 SPANNER.COMMIT_RESPONSE;
{ START | BEGIN } [ TRANSACTION | WORK ]
{ START | BEGIN } [ TRANSACTION | WORK ] [{ READ ONLY | READ WRITE }]
מתחילים עסקה חדשה. מילות המפתח TRANSACTION ו-WORK הן אופציונליות, שוות ערך ולא משפיעות.
- משתמשים ב-
COMMITאו ב-ROLLBACKכדי להפסיק עסקה. - אם הפעלתם את מצב
AUTOCOMMIT, ההצהרה הזו מוציאה את החיבור ממצבAUTOCOMMITבאופן זמני. החיבור חוזר למצבAUTOCOMMITכשהעסקה מסתיימת. - אם לא מצוין
READ ONLYאוREAD WRITE, מצב העסקה נקבע לפי מצב העסקה שמוגדר כברירת מחדל בסשן. הגדרת ברירת המחדל הזו נקבעת באמצעות הפקודהSET SESSION CHARACTERISTICS AS TRANSACTIONאו באמצעות הגדרת המשתנהREADONLY.
אפשר להריץ את ההצהרה הזו רק כשאין טרנזקציה פעילה.
דוגמה: 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; -- Add 'READ WRITE' or 'READ ONLY' to the 'BEGIN' command to -- override the current default of the connection. SET READONLY=FALSE; BEGIN READ ONLY; SELECT FirstName, LastName FROM Singers ORDER BY LastName; COMMIT;
COMMIT [TRANSACTION | WORK]
COMMIT [ TRANSACTION | WORK ]
מאשרים את העסקה הנוכחית. מילות המפתח TRANSACTION ו-WORK הן אופציונליות ושקולות, ואין להן השפעה.
- כשמבצעים קומיט של טרנזקציית קריאה-כתיבה, כל העדכונים של הטרנזקציה הזו נראים לטרנזקציות אחרות, וכל הנעילות של הטרנזקציה ב-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 READ ONLY; SELECT FirstName, LastName FROM Singers ORDER BY LastName; COMMIT;
{ ABORT | ROLLBACK } [TRANSACTION | WORK]
{ ABORT | ROLLBACK } [TRANSACTION | WORK]
מבצע ROLLBACK של העסקה הנוכחית. מילות המפתח TRANSACTION ו-WORK הן אופציונליות ושקולות, ואין להן השפעה.
- ביצוע
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 READ ONLY; SELECT FirstName, LastName FROM Singers ORDER BY LastName; ROLLBACK;
SET TRANSACTION
SET TRANSACTION { READ ONLY | READ WRITE }
הפרמטר הזה מגדיר את מצב העסקה עבור העסקה הנוכחית.
אפשר להריץ את ההצהרה הזו רק אם AUTOCOMMIT הוא false, או אם התחלתם טרנזקציה על ידי הרצת BEGIN [TRANSACTION | WORK] ועדיין לא הרצתם הצהרות בטרנזקציה.
ההצהרה הזו מגדירה את מצב העסקה רק לעסקה הנוכחית. כשמבצעים Commit או Rollback לעסקה, העסקה הבאה משתמשת במצב ברירת המחדל של החיבור.
(ראו SET SESSION CHARACTERISTICS).
דוגמה: 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;
הגדרת מאפייני הסשן
SET SESSION CHARACTERISTICS AS TRANSACTION { READ ONLY | READ WRITE }
ההגדרה הזו קובעת את מצב ברירת המחדל של העסקאות בסשן כ-READ ONLY או כ-READ WRITE. אפשר להשתמש בהצהרה הזו רק אם אין עסקה פעילה.
הפקודה SET TRANSACTION יכולה לבטל את ההגדרה הזו.
דוחות באצווה
ההצהרות הבאות מנהלות קבוצות של הצהרות 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 BIGINT NOT NULL PRIMARY KEY, FirstName VARCHAR, LastName VARCHAR ); -- This statement is buffered locally until RUN BATCH is executed. CREATE TABLE Albums ( AlbumId BIGINT NOT NULL PRIMARY KEY, Title VARCHAR, SingerId BIGINT, CONSTRAINT fk_albums_singers FOREIGN KEY (SingerId) REFERENCES Singers (SingerId) ); -- 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
מנקה את כל הצהרות ה-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 BIGINT NOT NULL PRIMARY KEY, FirstName VARCHAR, LastName VARCHAR ); -- This statement is buffered locally until RUN BATCH is executed. CREATE TABLE Albums ( AlbumId BIGINT NOT NULL PRIMARY KEY, Title VARCHAR, SingerId BIGINT, CONSTRAINT fk_albums_singers FOREIGN KEY (SingerId) REFERENCES Singers (SingerId) ); -- This aborts the DDL batch and removes the DDL statements from the buffer. ABORT BATCH;
START BATCH DML ו-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 תומך רק בשאילתות עם חלוקה למחיצות.
אפשר להפעיל את Data Boost בחיבור הנוכחי באמצעות ההצהרה SET SPANNER.DATA_BOOST_ENABLED.
מנהל ההתקן של JDBC תומך בשלוש חלופות להפעלת שאילתות עם חלוקה למחיצות:
SET SPANNER.AUTO_PARTITION_MODE = trueRUN PARTITIONED QUERY sql-
PARTITION sqlואחריו כמהRUN PARTITION 'partition-token'
כל אחת מהשיטות האלה מתוארת בקטעים הבאים.
SPANNER.DATA_BOOST_ENABLED
מאפיין מסוג BOOL שמציין אם החיבור הזה צריך להשתמש בData Boost לשאילתות עם חלוקה למחיצות. ערך ברירת המחדל הוא false.
SHOW [VARIABLE] SPANNER.DATA_BOOST_ENABLED
SET SPANNER.DATA_BOOST_ENABLED {TO|=} { true | false }
ההגדרה הזו קובעת אם החיבור הזה צריך להשתמש בData Boost לשאילתות עם חלוקה למחיצות.
ערך ברירת המחדל הוא false.
דוגמה: הפעלת שאילתה באמצעות Data Boost (לחיצה להרחבה)
בדוגמה הבאה מוצגת שאילתה באמצעות Data Boost עם מנהל ההתקן Spanner JDBC.
-- Enable Data Boost on this connection. SET SPANNER.DATA_BOOST_ENABLED = true; -- Execute a partitioned query. Data Boost is only used for partitioned queries. RUN PARTITIONED QUERY SELECT FirstName, LastName FROM Singers;
דוגמה מלאה מופיעה במאמר PostgreSQL DataBoostExample.
SPANNER.AUTO_PARTITION_MODE
מאפיין מסוג BOOL שמציין אם החיבור משתמש אוטומטית בשאילתות מחולקות לכל השאילתות שמופעלות.
SHOW [VARIABLE] SPANNER.AUTO_PARTITION_MODE
SET SPANNER.AUTO_PARTITION_MODE {TO|=} { true | false}
- מגדירים את המשתנה הזה לערך
trueאם רוצים שהחיבור ישתמש בשאילתה עם חלוקה למחיצות לכל השאילתות שמופעלות. - אם רוצים שהחיבור ישתמש ב-Data Boost לכל השאילתות, צריך להגדיר את
SPANNER.DATA_BOOST_ENABLEDל-true.
ערך ברירת המחדל הוא false.
דוגמה: הפעלה (לחיצה להרחבה)
בדוגמה הזו מופעלות שתי שאילתות באמצעות מנהל ההתקן Spanner JDBC, תוך שימוש ב-Data Boost.
SET SPANNER.AUTO_PARTITION_MODE = true SET SPANNER.DATA_BOOST_ENABLED = true SELECT FirstName, LastName FROM Singers SELECT SingerId, Title FROM Albums
דוגמה מלאה אפשר לראות ב-PostgreSQL AutoPartitionModeExample.
הפעלת שאילתה עם חלוקה למחיצות
RUN PARTITIONED QUERY <sql>
מריץ שאילתה כשאילתה מחולקת ב-Spanner. כדי להריץ את השאילתה עם Data Boost, צריך לוודא שהערך של SPANNER.DATA_BOOST_ENABLED הוא true:
SET SPANNER.DATA_BOOST_ENABLED = true
RUN PARTITIONED QUERY SELECT FirstName, LastName FROM Singers
מנהל ההתקן של JDBC מחלק את השאילתה באופן פנימי ומבצע את החלוקות במקביל. התוצאות ממוזגות לקבוצת תוצאות אחת ומוחזרות לאפליקציה. אפשר להגדיר את מספר השרשורים של העובדים שמבצעים מחיצות באמצעות המשתנה SPANNER.MAX_PARTITIONED_PARALLELISM.
דוגמה מלאה מופיעה במאמר PostgreSQL RunPartitionedQueryExample.
PARTITION <SQL>
PARTITION <sql>
יוצר רשימה של מחיצות להרצת שאילתה ב-Spanner ומחזיר רשימה של טוקנים של מחיצות. אפשר להריץ כל אסימון מחיצה בחיבור JDBC נפרד באותו מארח או במארח אחר באמצעות הפקודה 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';
דוגמה מלאה זמינה במאמר PostgreSQL PartitionQueryExample.
RUN PARTITION 'partition-token'
RUN PARTITION 'partition-token'
מריץ חלוקה של שאילתה שהוחזרה קודם על ידי הפקודה PARTITION. אפשר להריץ את הפקודה בכל חיבור JDBC שמחובר לאותו מסד נתונים שבו נוצרו אסימוני החלוקה.
דוגמה מלאה זמינה במאמר PostgreSQL PartitionQueryExample.
SPANNER.MAX_PARTITIONED_PARALLELISM
מאפיין מסוג int8 שמציין את מספר ה-worker threads שמשמשים את מנהל ההתקן של Spanner JDBC להפעלת מחיצות. הערך הזה משמש ל:
SPANNER.AUTO_PARTITION_MODE = trueRUN PARTITIONED QUERY sql
SHOW [VARIABLE] SPANNER.MAX_PARTITIONED_PARALLELISM
SET SPANNER.MAX_PARTITIONED_PARALLELISM = <int8>
מגדיר את המספר המקסימלי של שרשורי עבודה שמנהל ההתקן של Spanner JDBC יכול להשתמש בהם כדי להפעיל מחיצות. הגדרת הערך הזה ל-0 מורה לדרייבר Spanner JDBC להשתמש במספר ליבות ה-CPU במכונת הלקוח כערך המקסימלי.
ערך ברירת המחדל הוא 0.
פקודות של נקודות שמירה
ההצהרות הבאות מפעילות או משביתות נקודות שמירה מדומה בעסקאות. כדי ליצור נקודת שמירה, קוראים לשיטה java.sql.Connection#setSavepoint().
מנהל ההתקן Spanner JDBC מדמה נקודות שמירה כדי לתמוך במסגרות שמסתמכות על נקודות שמירה עבור טרנזקציות מקוננות. נקודות השמירה מודמות על ידי מעקב אחרי סכום ביקורת רץ של התוצאות שהוחזרו על ידי הצהרות בעסקה. כשמבצעים Rollback לנקודת שמירה, מנהל ההתקן של Spanner JDBC מבצע Rollback לעסקה, ואז מנסה שוב את העסקה עד לנקודה שבה נקבעה נקודת השמירה. סכום הביקורת של הניסיון החוזר מושווה לסכום הביקורת של העסקה הראשונית כדי לוודא שהתוצאות זהות.
SPANNER.SAVEPOINT_SUPPORT
SHOW [VARIABLE] SPANNER.SAVEPOINT_SUPPORT
SET SPANNER.SAVEPOINT_SUPPORT {TO|=} { '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 SPANNER.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 SPANNER.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 SPANNER.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 למסד נתונים של ניב PostgreSQL