1 ניהול תנועות חלק 3 transaction management part 3

58
1 תתתתת תתתתתת תתת3 Transaction Management Part 3

Post on 18-Dec-2015

225 views

Category:

Documents


2 download

TRANSCRIPT

1

ניהול תנועות 3חלק

Transaction Management

Part 3

2

נעילות ללא מקביליות בקרת

3

נעילות ללא מקביליות בקרת

העסקאות מתבצעות ללא הגבלה, אבל יש צורך בבדיקות כדי לוודא שלא

נוצר תזמון שאינו בר סדרתיותשני סוגים:

בקרת מקביליות אופטימית

בקרת מקביליות המבוססת על שימוש

בחותמות זמן לכל הפריטים

optimistic concurrency control

Timestamp-Based Concurrency Control

4

הבסיסי הרעיון

סדרתי תזמון על מראש מחליטים , שמתבצע המקבילי שהתזמון מוודאים

שעליו, הסדרתי לתזמון שקול בפועלהוחלט

שומרות מבצעת שעסקה שהפעולות מוודאיםשעליו הסדרתי התזמון עם השקילות על

הוחלט

הבדיקות לביצוע זמן בחותמות משתמשים

5

את עוברת אינה עסקה אםאותה, לבטל צריך הבדיקה

נבדקת עסקה כל , העסקה בהצלחה עוברת הבדיקה אם

להתחייב רשאית , הבדיקה את עוברת אינה עסקה אם

לגרום עלולה שהעסקה היא המשמעות , צריך ולכן סדרתיות בר שאינו לתזמון

אותה להריץ ולהתחיל אותה לבטלמחדש

6

נעילות ללא מקביליות בקרתעם מקביליות בקרת לעומת

נעילותעל המבוססת מקביליות בקרת של המחיר

של מהמחיר מורכב נעילות , למנוע או לגלות הצורך כולל המנעולים ניהול

קיפאון מצבי

נעילות ללא מקביליות בקרת של המחירשל מהמחיר מורכב

שמירת ) של המחיר כולל לבצע שצריך הבדיקות) , הבדיקות ביצוע לצורך שנחוץ מסוים מידע

) האופטימית ) בגרסה כפולה כתיבה

7

אינה הגישות משתי אחת כלמקסימלית מקביליות משיגה

) , עסקאות ) משהות כלומר חוסמות נעילות , ידי על נעולים שכרגע לפריטים הזקוקות

אחרות עסקאות , ולהתחיל לבטל חייבים נעילות אין כאשר

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

בנעילות(

8

אופטימית מקביליות בקרת

Optimistic Concurrency Control

9

בקרת מקביליות אופטימיתOptimistic Concurrency

Controlעד הבדיקה את דוחים האופטימית בגישה

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

העסקה את

10

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

הקריאה שלבשל הפנימי בזיכרון פרטי עבודה שטח מוקצה עסקה לכל

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

הפרטי העבודה

הבדיקה שלבהכתיבה שלב

, את מעתיקה העסקה בהצלחה עברה הבדיקה אםלמסד הפרטי העבודה משטח הסופיות התוצאות

11

קריטי קטע

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

, אחת לעסקה רק מאפשרת המערכת זמן נקודת בכל ) הללו) השלבים את לבצע היותר לכל

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

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

הנתונים, למסד כותבת היותר לכל אחת עסקה רק בפרטנתון רגע בכל

, אינה אחרת עסקה אף למסד כותבת שעסקה בזמןמהמסד לקרוא יכולה

12

? המקביליות איפה אז

לזמן יחסי באופן זמן מעט לוקחת הבדיקההעסקה של הריצה

, כל כי זמן מעט לוקחת הכתיבה גםלהעתיק נשאר ורק בוצעו כבר החישובים

העבודה משטח הסופיות התוצאות אתלמסד הפרטי

במקביל, מתבצעת העסקה הזמן רוב לפיכךאחרות לעסקאות

13

זמן חותמת

כל עסקה מקבלת חותמת זמן בתחילת שלב הבדיקהTS(Ti) מסמן את חותמת הזמן של העסקה Ti

הרעיון הבסיסי: התזמון הנוצר על ידי העסקאות שעוברות את הבדיקות שקול

לתזמון הסדרתי שבו העסקאות מבוצעות לפי הסדר של חותמות הזמן

כלומר, עסקה שעוברת את הבדיקה "כאילו" מתבצעת בצורה אטומית ברגע של תחילת

הבדיקה

14

? לבדוק צריך מה אז

Ti צריכה להיבדק כנגד כל עסקה Tkעסקה Tiשהתחייבה לפניה, כלומר כנגד כל עסקה

שמקיימתTS(Tk) > TS(Ti)וגם

Ti עברה בהצלחה את הבדיקה -כמובן שTi -עברה את הבדיקה בהצלחה לפני ש Tk

החלה את הבדיקה

פועלות עליו Ti וגם Tkלגבי כל פריט ש- (ולפחות אחת משתי הפעולות איננה קריאה),

מתבצעת אחרי Tkצריך לבדוק שהפעולה של Tiהפעולה של

15

? נבדוק איך

הסתיימה, אז Ti התחילה אחרי ש- Tkאם מתבצעות אחרי Tkברור שכל הפעולות של

Tiהפעולות של

בכל מקרה, ברור שכל פעולות הכתיבה של Tk מתבצעות אחרי פעולות הקריאה והכתיבה

, כי העסקאות מבצעות את שלבי Tiשל הבדיקה והכתיבה בצורה סדרתית (והנחנו ש-

TS(Tk) > TS(Ti)(

16

? לבדוק נשאר מה אז

הסתיימה, אז Ti התחילה לפני ש- Tkאם ונקרא על Ti שנכתב על ידי Aלכל פריט

קוראת את Tk, צריך לבדוק ש- Tkידי ביצעה את פעולת Ti אחרי ש- Aהערך של

Aהכתיבה על לא כותבת שום פריט ש- Tiתנאי מספיק:

Tkקוראת

17

לסיכום, בגישה האופטימית, עבור צריך לבדוק את הדבר Tkעסקה

הבא, כלומר Tk שהתחייבה לפני Tiלכל עסקה

TS(Tk) > TS(Ti) צריך להתקיים אחד משני ,התנאים הבאים:

Tk -התחילה אחרי ש Tiסיימה, או

Ti -אינה כותבת שום פריט ש Tkקוראת

כדי לבצע את הבדיקות, צריך לשמור לכל עסקה את המידע הבא

רשימת הפריטים שהעסקה כותבתרשימת הפריטים שהעסקה קוראת

זמני ההתחלה והסיום של כל עסקה

לשמור צריך מתי עדעסקה על המידע את? בהצלחה שהסתיימה

18

האופטימית לגישה שיפור

עברה בהצלחה את שלב Tiכאשר עסקה Tkהבדיקה, אפשר לבדוק האם יש עסקה

שטרם החלה את שלב הבדיקה, אבל כבר עומדת לכתובTi ש- Aקראה פריט

כנ"ל, אז ברור שהיא תיכשל Tkאם יש עסקה בשלב הבדיקה

) או לתת kill policy מייד (Tkאפשר להרוג את dieלה למות כשתגיע לשלב הבדיקה (

policy(

19

לשמור שצריך המידע

צריך טבלה עם רשומות מהצורה)transaction id, item id, modified(

כל עסקה, שקוראת פריט, מוסיפה רשומה id של העסקה וה- idכנ"ל לטבלה עם ה-

של הפריטfalse הוא בהתחלה modifiedהשדה

כאשר עסקה מסתיימת בהצלחה או מתבטלת, כל הרשומות שלה נמחקות

מהטבלה

20

הכתיבה בשלב

, A כותבת למסד פריט Tiכאשר עסקה הרשומות כלהיא שולפת מהטבלה את

ומשנה בכולן את השדה Aעבור הפריט modified -ל true

) את כל kill policyאפשר להרוג מייד (שינתה, Tiהעסקאות, שאת הרשומות שלהן

או לתת להן למות כשתגענה לשלב )die policyהבדיקה (

21

הבדיקה בשלב

נבדקת, צריך לשלוף Tkכאשר עסקה מהטבלה את כל הרשומות עבור עסקה זו

אם (לפחות) באחת הרשומות, עבור פריט , true הוא modified, השדה Aכלשהו

פירוש הדבר שעסקה שכבר התחייבה כתבה לא קראה אותוTk, אבל Aערך עבור

Tkלכן צריך, לבטל את

22

הטבלה על הפעולותמנעול מחייבות

כאשר עסקה מוסיפה רשומה לטבלה או בכל הרשומות modifiedמשנה את השדה , הדבר מצריך מנעול Aעבור פריט נתון

בלעדי על הטבלה

23

? עדיפה גישה איזהלמות לתת או מייד להרוג

בבדיקה?מיד, להרוג עדיף לכאורה

עד לרוץ להמשיך לעסקה מאפשרים אם אבל , ( , קרי הפנימי לזיכרון תביא היא הבדיקה שלב

שהיא( המסד של הדפים כל את לחוצציםצריכה

הרבה, תהיה העסקה של הבאה הריצה לכןשהיא יותר גדול סיכוי יש ולפיכך קצרה יותר

בהצלחה הבדיקה שלב את תעבור

24

, המסד, של הדפים כל הבאה שבריצה כמובןבתנאי הפנימי בזיכרון יהיו כבר צריכה שהעסקה

ש-כל את לשמור בזיכרון מקום מספיק יש

עסקאות ) של דפים עם יחד הדפים) בינתיים שרצות אחרות

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

, צריך: אז שוב מתבטלת העסקה אם הערה , שלה הדפים כל ממילא כי מיד אותה להרוג

הפנימי בזיכרון כבר

25

על המבוססת מקביליות בקרתזמן חותמות

Timestamp-Based Concurrency Control

26

בקרת מקביליות המבוססת על חותמות זמןTimestamp-Based Concurrency

Controlסיום לקראת הבדיקה את לבצע במקום

שהעסקה, פעם בכל בדיקה מבצעים העסקהכותבת או קוראת

מתחילה היא כאשר זמן חותמת מקבלת עסקהבפועל הנוצר שהתזמון לוודא הבדיקות מטרת

העסקאות שבו הסדרתי לתזמון מבטים שקול הנוהזמן חותמות של הסדר לפי מתבצעות

" מיד" אטומית בצורה מתבצעת עסקה כל כאילומתחילה כשהיא

27

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

לאחרונה (ליתר דיוק, הזמן של העסקה הצעירה ביותר )Aשקראה את

WTS(A) הנה חותמת זמן המציינת מתי הפריט נכתב לאחרונה (ליתר דיוק, הזמן של העסקה הצעירה ביותר

)Aשכתבה את

משנה את A שקוראת פריט Tבעקרון, עסקה RTS(A) -ל TS(T) אם RTS(A) -קטן מ TS(T)

משנה את A שכותבת פריט Tבאופן דומה, עסקה WTS(A) -ל TS(T) אםWTS(A) -קטן מ TS(T)

28

? לבדוק צריך מה

לא יכולה לקרוא פריט שכבר Tעסקה נכתב על ידי עסקה אחרת, שאמורה

Tלהתבצע אחרי רוצה לקרוא פריט Tבמילים אחרות, אם

Aאז , T, אז צריך לבטל את TS(T) < WTS(A)אם

ולהתחיל אותה מחדש (עם חותמת זמן חדשה) ו-A קוראת את Tאחרת

RTS(A) := max{ TS(T), RTS(A) }

29

? לבדוק צריך עוד מה

לא יכולה לכתוב פריט שכבר Tעסקה נקרא על ידי עסקה אחרת, שאמורה

Tלהתבצע אחרי רוצה לכתוב פריט Tבמילים אחרות, אם

Aאז , T, אז צריך לבטל את TS(T) < RTS(A)אם

ולהתחיל אותה מחדש (עם חותמת זמן חדשה), TS(T) > WTS(A) וגם TS(T) > RTS(A)אם WTS(A) := TS(T) ו- A כותבת את Tאז

30

TS(T) > RTS(A)ומה קורה אם ?TS(T) < WTS(A)וגם

לא עושים כלום והעסקה יכולה להמשיך, או לשנות Aמבלי לכתוב ערך חדש עבור

WTS(A)את הייתה אמורה לבצע Tכלומר, השינוי ש- הנו חסר משמעות, Aבערכו של הפריט

על ידי עסקה Aכתוצאה מכתיבה עיוורת של ובתזמון A, שכבר כתבה את ’Tאחרת

Tהסדרתי השקול היא מופיעה אחרי

31

על Aאיך יודעים שהכתיבה של היא כתיבה עיוורת?’Tידי TS(T’) -שווה ל WTS(A) כי ,T’ היא

Aהאחרונה שכתבה את , אז היה A גם קראה את ’Tאילו

TS(T), כי TS(T) < RTS(A)מתקיים < WTS(A)

TS(T) > RTS(A)אבל נתון ש-

32

מלוכלכת קריאה למנוע צריך

צריכה למעשה A שכותבת פריט Tעסקה לחסום עסקאות אחרות שרוצות לקרוא

מתחייבת T עד שברור ש- Aאת Aשקול למעשה לאחזקת מנעול בלעדי על

עד ההתחייבות

אם הדבר לא נעשה, אז יכולות להיות קריאות מלוכלכות, שעלולות לגרום למפל הפלות ולתזמון שאינו מאפשר התאוששות

33

סיכום

פרוטוקול חותמות הזמן מאפשר תזמונים שאינם (גם כשמונעים קריאות 2PLאפשריים על ידי

מלוכלכות)וגם ההפך נכון

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

מלוכלכות, פרוטוקול חותמות הזמן פחות טוב מפרוטוקולים של נעילות במערכות מרכזיות

משתמשים בו בעיקר במערכות מסדי נתונים מבוזרים

34

גרסאות מרובת מקביליות בקרת

Multiversion Concurrency Control

35

בקרת מקביליות מרובת Multiversionגרסאות

Concurrency Controlלכל פריט במסד שומרים גרסאות רבות

היא למעשה A כותבת פריט Tכשעסקה , שה- Aמייצרת גרסה חדשה של

WTS(A) -שלה שווה ל TS(T) אותו ה- Aלכל הגרסאות של פריט

RTS(A)ששווה ל ,- TS של העסקה הכי Aמאוחרת שקראה את

36

לקרוא אפשר תמיד

, A שרוצה לקרוא פריט Tעסקה קוראת את הגרסה שיש לה את ה-

WTS(A) הכי גדול, מבין כל אלה TS(T)שקטנים מ-

:RTS(A)העסקה מעדכנת את RTS(A) := max{ TS(T),

RTS(A) }

37

? כותבים איך

, אז A רוצה לכתוב פריט Tאם עסקה צריך לבדוק (כמו בפרוטוקול חותמות

TS(T) > RTS(A)הזמן הרגיל) ש- אם תנאי זה מתקיים, אז מייצרים גרסה

ששווה ל- WTS(A), שיש לה Aחדשה של TS(T)

-הRTS(A) -של הגרסה החדשה הוא כמו ה RTS(A) של כל הגרסאות הקיימות (לכולן אותו

)RTS(A)ה-

Tאם התנאי אינו מתקיים, אז צריך לבטל את ולהתחיל אותה מחדש

38

לסיכום

היתרון היא לקרוא אפשר שתמיד העובדההגרסאות רב הפרוטוקול של הגדול

) באורקל ) כנראה קיים זה פרוטוקול

קריאת מצריכה הקבצה שאילתת לדוגמהרב זמן לקחת ויכולה פריטים של רב מספראו תחסם לא כזאת ששאילתה רצוי לפיכך

תתבטל

לא שכבר ברור כאשר גרסאות למחוק צריךצורך בהן יהיה

39

הקשורים נוספים נושאיםלנעילות

40

מרובה גרעיניות עם מנעולים

Multiple-Granularity Locks

41

מנעולים עם גרעיניות מרובהMultiple-Granularity Locksהדפים מרבית את לנעול צריכה עסקה אם

,) ( ) עדיף) אז יחס טבלה של בלוקים , להקטין כדי היחס כל את תנעל שהעסקה

במנעולים הטיפול של התקורה את , רק לנעול צריכה עסקה אם זאת לעומת

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

במקביל לפעול אחרות מעסקאות למנועטבלה אותה של אחרים דפים על

42

דומה באופן

מרבית את לנעול צריכה עסקה אם , אז נתון בדף הנמצאות הרשומות

הדף כל את לנעול מוטב , לנעול צריכה עסקה אם זאת לעומת

, מוטב אז מהרשומות קטן חלק רקאת ולא האלה הרשומות את רק לנעול

הדף כל

43

לנהל, כיצד היא הבעיה לפיכךגרעיניות של שונות ברמות נעילות

, כדי תוך להחליט צריך המנעולים מנהל , המנעולים גרעיניות מהי העסקאות ביצוע

עסקה לכל שתינתןהגרעיניות את לשנות צריך הצורך במידת

העסקה ביצוע במהלך

לעסקה שניתן בלעדי שמנעול מוודאים איךבלעדי מנעול סותר אינו מסוים דף על אחת

) כל) על אחרת לעסקה שניתן משותף אוהטבלה?

44

ההירארכיה לפי לנעול אפשרהנתונים מסד של הטבעית

ההירארכי המבנהטבלאות מכיל הנתונים מסד

) דפים ) מכילה יחס טבלה כל ) רשומות ) מכיל בלוק דף כל

, כאשר כעץ זה מבנה לתאר ניתןהנתונים מסד כל הוא השורש

הנמוכה מהרמה האיברים כל הם בעץ צומת של הילדיםבו המוכלים יותר

,הטבלה של הדפים כל הם טבלה של הילדים לדוגמה

45

X או Sנעילת צומת ע"י מנעול פירושה נעילת כל תת-העץ

מוחזק על צומת X או Sאם מנעול מסוג בעץ, אז המשמעות היא שמנעול זה

מוחזק על על כל הצאצאים של הצומתלכן, עסקה אינה צריכה לנעול צומת אם

היא מחזיקה מנעול מאותו הסוג על ) של ancestorהורה או הורה קדמון (

הצומת

46

צריך גם מנעולי כוונהIntention Locks

מסומן intention exclusiveמנעול מסוג IXע"י

, אז IXאם עסקה נועלת צומת ע"י מנעול פירוש הדבר שיש לה כוונה לנעול צאצאים

Xשל הצומת ע"י מנעול מסומן ע"י intention sharedמנעול מסוג

IS , אז ISאם עסקה נועלת צומת ע"י מנעול

פירוש הדבר שיש לה כוונה לנעול צאצאים Sשל הצומת ע"י מנעול

47

המנעולים סוגי בין תאימות Sכמו קודם, על צומת יכולים להיות מספר מנעולי

(של עסקה אחרת)Xכל עוד אין מנעול מסוג כל עוד אין ISעל צומת יכולים להיות מספר מנעולי

(של עסקה אחרת)Xמנעול מסוג כל עוד IXעל צומת יכולים להיות מספר מנעולי

(של עסקאות אחרות)X או Sאין מנעולים מסוג ISלדוגמה, על צומת יכולים להיות מספר מנעולי

בו-זמניתIXומספר מנעולי S ומספר מנעולי ISאפשר גם מספר מנעולי

בו-זמנית, אז אין אפשרות לאף מנעול נוסףXאם יש מנעול

48

מטריצת התאימויות(בין שתי עסקאות שונות)

ISSIXX

IS☑☑☑☒S☑☑☒☒IX☑☒☑☒X☒☒☒☒

וגם IXעסקה אחת יכולה להחזיק S

49

- גרעיניות רב לנעילות הפרוטוקול

עסקה חייבת להתחיל בנעילת השורש ע"י S, X, IX או IS

אם S או ISעסקה יכולה לנעול צומת ע"י על ההורה של הצומת ISהיא מחזיקה

אם X או IXעסקה יכולה לנעול צומת ע"י על ההורה של הצומתIXהיא מחזיקה

, X או S כשעסקה נועלת צומת ע"י :הערהאז כל הצאצאים של הצומת נעולים גם הם

ואין צורך להמשיך לרדת בעץ כדי לנעול

50

הפרוטוקול המשך

,ISאי אפשר להסיר מנעול מכל סוג שהוא (IX, S או X מצומת נתון, אלא אם כן אין שום (

מנעולים על הילדים של הצומתכל הנעילות (מכל ארבעת הסוגים) מתנהלות

לפי הפרוטוקול של נעילות בשתי פאזות:תחילה, עסקה מבצעת רק נעילות

לאחר השחרור הראשון של מנעול (מכל סוג שהוא), עסקה יכולה רק לשחרר מנעולים

51

ש התנאי נדרש מדוע

,ISעסקה יכולה להסיר מנעול מכל סוג שהוא (IX, S או X מצומת נתון רק אם אין לה שום (

מנעולים על הילדים של הצומת?אם עסקה מסירה את המנעול שלה מהשורש

(ואין מנעולים אחרים על השורש), אז כל Xעסקה אחרת יכולה לנעול את השורש ע"י

Xואז למעשה כל העץ נעול ע"י X או Sאם העסקה הראשונה עדיין מחזיקה מנעול על צומת כלשהי בעץ זה סותר את הדרישה

בלעדי על כל Xשהעסקה האחרת מחזיקה מנעול העץ

52

נפוץ מקרה

עסקה רוצה לקרוא יחס במלואו ולשנות מספר קטן של רשומות השייכות ליחס

העסקה תנעל את הצומת המתאימה לכל S וע"י IXהיחס ע"י

ISעסקאות אחרות יכולות לנעול צומת זה ע"י

בהמשך העסקה תנעל צאצאים נוספים X או IXע"י

עסקאות אחרות יכולות לנעול צאצאים אחרים Sע"י

53

הסלמה של גירעוןGranularity Escalation

איך מחליטים מהי הגרעיניות המתאימה לעסקה נתונה?

אפשר להתחיל עם גרעיניות עדינה (למשל, נעילה ברמה של רשומות) ולאחר

שמספר המנעולים שהעסקה מבקשת עובר סף מסוים, אז מגדילים את הגרעיניות

לרמה הבאה (למשל, נעילות ברמה של ורק Xעסקה יכולה לנעול צומת ע"י דפים)

Xאח"כ לנעול הורה של הצומת ע"י

54

נכונות

הפרוטוקול של נעילות רב גרעיניות מייצר רק תזמונים ברי סדרתיות קונפליקטית

506ההוכחה בספר של אולמן, עמוד קרויים intention locksבספר של אולמן

warnings

55

נושאים עודלנעילות הקשורים

56

Latchesבריחים

להחזיק, יכולות עסקאות שתי בעקרוןשונות- רשומות שתי על מנעולים זמנית בו

בלוק באותו שנמצאות - על זמנית בו לפעול אפשר שאי מכיוון

, חייבת עסקה בלוק אותו של שונים חלקיםשבו הזמן לפרק הבלוק על בריח להחזיקרשומה של כתיבה או קריאה מבצעת היא

לבלוק השייכת

57

+Bפעולות מקביליות על עצי

(העץ יכול +Bכאשר ניגשים ליחס דרך עץ להיות אינדקס ראשי או משני), צריך לנעול

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

הרמות העליונות של העץ נחוצות למספר רב של עסקאות בו-זמנית

ייצור עיכובים לא רצויים וצווארי 2PLפרוטוקול בקבוק

58

לשפר אפשר

לפי +Bניתן לנעול צמתים של עץ פרוטוקול שמאפשר יותר מקביליות מאשר

2PLבמיוחד, אפשר לשחרר את הנעילות על הרמות העליונות של העץ מוקדם יותר,

כלומר אין צורך לחכות לפאזה של שחרור המנעולים

פרטים בספר