1. Trang chủ
  2. » Luận Văn - Báo Cáo

Mở rộng truy vấn MySQL và ứng dụng chuyển đổi dữ liệu dạng bảng sang JSON

63 1,5K 5

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 63
Dung lượng 1,55 MB

Nội dung

JSON rất hữu ích khi sử dụng làm định dạng trao đổi dữ liệu nó được sử dụng trong hầu hết các ứng dụng web ajax như là một định dang trao đổi thay cho XML.. So với XML JSON có những ưu đ

Trang 1

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

LÊ VĂN NAM

MỞ RỘNG TRUY VẤN MYSQL VÀ ỨNG DỤNG CHUYỂN ĐỔI DỮ LIỆU DẠNG BẢNG SANG JSON

LUẬN VĂN THẠC SỸ

Trang 2

ĐẠI HỌC QUỐC GIA HÀ NỘI

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

LÊ VĂN NAM

MỞ RỘNG TRUY VẤN MYSQL VÀ ỨNG DỤNG CHUYỂN ĐỔI DỮ LIỆU DẠNG BẢNG SANG JSON

Ngành: Công Nghệ Thông Tin

Chuyên ngành: Hệ Thống Thông Tin

Trang 3

MỤC LỤC

LỜI NÓI ĐẦU 10

CHƯƠNG 1: TỔNG QUAN VỀ JSON VÀ ỨNG DỤNG 11

1.1 Khái niệm về JSON 11

1.2 Cấu trúc của Json 11

1.3 So sánh Json và XML 14

1.4 Phân tích JSON 15

1.5 Ứng dụng của JSON 19

CHƯƠNG 2: TỔNG QUAN KIẾN TRÚC HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU MYSQL 21

2.1 Lịch sử của hệ quản trị cơ sở dữ liệu MySQL 21

2.2 So sánh hệ quản trị CSDL MySQL và các hệ quản trị CSDL khác 22

2.3 Tổng quan kiến trúc MySQL 24

2.3.1 Giới thiệu - 24

2.3.2 Quản lý kết nối và an ninh - 25

2.3.3 Tối ưu hóa thực thi - 25

2.3.4 Kiểm soát đồng thời - 26

2.3.5 Kiểm soát giao dịch - 29

2.4 Các Storage engine trong kiến trúc MySQL 34

2.4.1 Các Storage engine - 34

2.4.2 Các điểm ưu việt của Storage engine. - 35

CHƯƠNG 3: MỞ RỘNG TRUY VẤN CHUYỂN ĐỔI DỮ LIỆU SANG DẠNG JSON 37

3.1 Hàm do người dùng định nghĩa (UDF) - 37

3.1.1 Hàm UDF đơn giản - 38

3.1.2 Hàm UDF tổng hợp - 43

3.1.3 Xử lý tham số trong hàm UDF - 48

3.1.4 Giá trị trả về của hàm UDF và kiểm soát lỗi trong hàm UDF - 51

3.1.5 Biên dịch và cài đặt hàm UDF - 51

3.1.6 Phân quyền truy cập hàm UDF - 54

Trang 4

3.2 Xây dựng hàm UDF chuyển đổi dữ liệu truy vấn sang dạng JSON 55

3.2.1.Hàm udf_json_to_array() - 55

3.2.2 Hàm udf_json_to_member - 56

3.2.3 Hàm udf_json_to_object - 57

3.2.4 Hàm udf_json_to_value - 58

KẾT LUẬN 64

TÀI LIỆU THAM KHẢO 65

Trang 5

DANH MỤC CÁC HÌNH

Hình 1.1 Cấu trúc của JSON 12

Hình 1.2 Kiếu dữ liệu mảng của JSON 12

Hình 1.3 Các kiểu dữ liệu của các phần tử trong mảng 13

Hình 1.4 Dữ liệu kiểu ký tự của JSON 13

Hình 1.5 Dữ liệu kiểu số của JSON 14

Hình 1.6 Quá trình xử lý truyền và nhận dữ liệu dạng JSON giữa máy chủ và máy khách 16

Hình 1.7 Quá trình truyền dữ liệu dạng JSON tại máy khách 16

Hình 1.8 Quá trình xử lý dữ liệu dạng JSON tại máy chủ 17

Hình 2.1 Kiến trúc tổng quan của hệ quản trị cơ sở dữ liệu MySQL 24

Hình 2.2 Kiến trúc MySQL với các kỹ thuật lưu trữ có thể gắn thêm 34

Trang 6

DANH MỤC CÁC BẢNG

Bảng 1.1 So sánh JSON và XML 16

Bảng 2.1 : So sánh về hệ điều hành hỗ trợ 22

Bảng 2.2 : So sánh về các tính năng cơ bản 23

Bảng 2.3 : So sánh về sự hỗ trợ bảng tạm và khung nhìn 23

Bảng 2.4 : So sánh về chức năng chỉ mục 23

Bảng 2.5 : So sánh về các đối tượng khác 23

Bảng 2.6 Các mức cô lập ANSI SQL 37

Bảng 3.1 Kiểu dữ liệu của C, C++ tương ứng với kiểu dữ liệu trong MySQL 32

Bảng 3.2 Các biến thành viên của mảng attribute_lengths 50

Trang 7

DANH MỤC CÁC TỪ VIẾT TẮT

Viết tắt Đầy đủ-mô tả

UDF User-Defined Functions-Hàm do người dùng định nghĩa

JSON JavaScript Object Notation-Một định dạng trao đổi dữ liệu Mailbox Hộp thư điện tử

Read/write Đọc/ghi

SQL Structured Query Language-Ngôn ngữ truy vấn dữ liệu

XML eXtensible Markup Language-Ngôn ngữ đánh dấu dữ liệu

ISO International Organization for Standardization –Tổ chức tiêu

chuẩn quốc tế

Cookie Thông tin lưu trong máy tính để nhận biết người dùng ghé

thăm một trang web

W3C World Wide Web Consortium-Là công ty lập ra các chuẩn cho

Internet nhất là Word Wide Web

Storage engine Phương pháp lưu trữ dữ liệu trong hệ quản trị CSDL MySQL

Trang 8

LỜI NÓI ĐẦU

JSON (JavaScript Object Notation) là một định dạng trao đổi dữ liệu Nó gần giống như một tập hợp con của cú pháp JavaScript, mặc dù nó không phải là một tập hợp con nghiêm ngặt JSON rất hữu ích khi sử dụng làm định dạng trao đổi dữ liệu nó được sử dụng trong hầu hết các ứng dụng web ajax như là một định dang trao đổi thay cho XML So với XML JSON có những ưu điểm sau:

 Không dài dòng, dữ liệu của nó nhỏ phù hợp trong việc trao đổi dữ liệu

 Trực tiếp giả mã tuần tự hóa (deserializable) thành cấu trúc các đối tượng bằng cách sử dụng hàm sẵn có trong Javascript là eval()

Chính vì vậy hiện nay hầu hết các ngôn ngữ lập trình đều hỗ trợ các hàm để thực hiện các thao tác đối với dữ liệu dạng JSON Tuy nhiên khi sử dụng các hàm sẵn có của các ngôn ngữ lập trình để thao tác với dữ liệu JSON có một nhược điểm là nó cần phải lặp qua tập kết quả để có thể tạo ra định dạng JSON thỏa mãn điều kiện đối với

dữ liệu lớn việc này thường rất chậm nếu trong chính các hệ quản trị CSDL có hỗ trợ các hàm chuyển đổi định dạng dữ liệu truy vấn sang dạng JSON thì tốc độ sẽ nhanh hơn MySQL là một hệ quản trị cơ sở dữ liệu mã nguồn mở được sử dụng phổ biến hiện nay ngoài ưu điểm tốc độ nhanh, miễn phí MySQL còn hỗ trợ người sử dụng thêm mới các hàm do người sử dụng tự viết để phù hợp với ứng dụng của mình Chính

vì vậy tôi đã chọn đề tài “Mở rộng truy vấn MySQL và ứng dụng chuyển đổi dữ liệu dạng bảng sang JSON”

Bố cục của luận văn được trình bày như sau:

Mở đầu

Đặt vấn đề về ý nghĩa, tính cấp thiết và tính thực thi của đề tài

Chương 1: Tổng quan về Json và ứng dụng

Trong chương này sẽ trình bày một cách khái quát về định dạng trao đổi dữ liệu JSON như cấu trúc của dữ liệu dạng JSON, quá trình gửi và nhận dữ liệu dạng JSON giữa máy chủ và máy khách và ứng dụng của JSON

Chương 2: Tổng quan kiến trúc hệ quản trị cơ sở dữ liệu MySQL

Trong chương này sẽ trình bày một cách khái quát và chi tiết nhất về lịch sử hình thành và kiến trúc của hệ quản trị CSDL MySQL

Chương 3: Mở rộng truy vấn chuyển đổi dữ liệu sang dạng json

Trong chương này sẽ trình bày các cách khác nhau để thêm mới một hàm vào máy chủ MySQL Tập trung tìm hiểu cách viết và thêm mới một hàm do người dùng định nghĩa (UDF) vào MySQL từ đó ứng dụng vào xây dựng hàm UDF để chuyển đổi

dữ liệu truy vấn sang dạng JSON

Trang 9

CHƯƠNG 1: TỔNG QUAN VỀ JSON VÀ ỨNG DỤNG 1.1 Khái niệm về JSON

JSON (JavaScript Object Notation) là một định dạng trao đổi dữ liệu Nó gần giống như một tập hợp con của cú pháp JavaScript, mặc dù nó không phải là một tập hợp con nghiêm ngặt Nó rất hữu ích khi viết bất kỳ loại ứng dụng dựa trên JavaScript, bao gồm cả các trang web và phần mở rộng trình duyệt Ví dụ chúng ta có thể lưu trữ thông tin người dùng trong định dạng JSON trong một Cookie hoặc có thể lưu trữ các phần mở rộng trong chuỗi giá trị JSON mà trình duyệt tham khảo tới

JSON có khả năng biểu diễn cho dữ liệu số, các phép toán, chuỗi, giá trị null, mảng và các đối tượng Nó không biểu diễn cho dữ liệu phức tạp như hàm, biểu thức thông thường, dữ liệu dạng ngày tháng Như vậy các đối tượng ngày theo mặc định được sắp xếp như là một chuỗi có chứa các ngày trong định dạng ISO

Trong khi XML (được định nghĩa trong đặc tả kỹ thuật XML 1.0 tại W3C) là một biểu diễn phổ biến để trao đổi thông điệp giữa máy chủ và máy khách JSON cũng được sử dụng với mục đích này và cho hiệu quả tượng tự như XML Một trong những

lý do để chấp nhận JSON là ở chỗ các đối tượng JSON dễ dàng được thao tác hơn bằng cách sử dụng các ngôn ngữ kịch bản như JavaScript, PHP, hoặc Ruby

1.2 Cấu trúc của Json

JSON được xây dựng trên 2 cấu trúc phổ biến sau:

Cấu trúc 1:

Là tập hợp của các cặp tên và giá trị (name-value) Trong những ngôn ngữ khác nhau đây thường là một đối tượng (object), bản ghi (record), cấu trúc (struct), từ điển(dictionary), bảng băm (hash table), danh sách khoá (keyed list) hay mảng liên hợp

Ví dụ: “firstName” : “John”

Cấu trúc 2:

Là một tập hợp các giá trị đã được sắp xếp Trong hầu hết các ngôn ngữ nó có thể

là một mảng, véctơ, tập hợp

Cấu trúc là tập hợp của các cặp tên và giá trị

Đây là một cấu trúc dữ liệu phổ dụng Hầu như tất cả các ngôn ngữ lập trình hiện đại đều hỗ trợ chúng trong một hình thức nào đó Chúng tạo nên ý nghĩa của một định dạng hoán vị dữ liệu với các ngôn ngữ lập trình cũng đã được cơ sở hoá trên cấu trúc này

Trang 10

Một đối tượng là một hỗn độn của các cặp tên và giá trị Một đối tượng bắt đầu bởi dấu ngoặc đơn trái { và kết thúc với dấu ngoặc đơn phải } Từng tên được theo sau bởi dấu hai chấm : và các cặp tên/giá trị được tách ra bởi dấu phẩy

Hình 1.1: Cấu trúc của JSON 1

Một mảng là một tập hợp các giá trị đã được sắp xếp Một mảng bắt đầu bởi dấu

mở ngoặc vuông [ và kết thúc với dấu ngoặc vuông phải ] Các giá trị được cách nhau bởi dấu phẩy

Hình 1.2 Kiểu dữ liệu mảng của json 2

Giá trị có thể là một số, một chuỗi hay kiểu dữ liệu đúng sai, giá trị cũng có thể là một mảng hay một đối tượng những cấu trúc này có thể lồng vào nhau

Trang 11

Hình 1.3 Các kiểu dữ liệu của các phần tử trong mảng 3

Một chuỗi(String) là một tập hợp của không hay nhiều ký tự Unicode, được đặt trong dấu trích dẫn kép (") Một chuỗi trong JSON rất giống như là chuỗi trong ngôn ngữ lập trình C và Java

Hình 1.4 Dữ liệu kiểu ký tự trong json 4

Kiểu số rất giống với kiểu số trong ngôn ngữ lập trình C và Java trừ định dạng bát phân và hex là không thể dùng

3,4,5 Nguồn:http://json.org/

Trang 12

Hình 1.5 Dữ liệu kiểu số trong Json 5

1.3 So sánh JSON và XML

Cả hai JSON và XML có thể được sử dụng để biểu diễn dữ liệu tự nhiên, các đối tượng trong bộ nhớ, đoạn văn bản, định dạng trao đổi dữ liệu Hơn nữa định dạng trao đổi giữa liệu của JSON và XML là tương đương Ví dụ khi gọi một dịch vụ web truy cập công cộng của Yahoo chúng ta có thể xác định chuỗi tham số được biểu diễn bằng XML hoặc JSON Vì vậy khi quyết định theo một định dạng trao đổi dữ liệu nó không phải là một vấn đề đơn giản tuy nhiên dựa vào những đặc trưng của ứng dụng cụ thể

mà đưa ra sự lựa chọn tốt nhất JSON có kiểu dữ liệu giống như ngôn ngữ lập trình và

có cấu trúc do đó dễ dàng hơn trong việc ánh xạ với những dữ liệu trao đổi có cấu trúc Bảng 1.1 chỉ ra những điểm khác nhau giữa JSON và XML

Kiểu dữ liệu (Data

type)

Không cung cấp kiểu dữ liệu người

ta phải dựa vào lược đồ XML để xác định kiểu dữ liệu

Cung cấp các kiểu dữ liệu đơn giản cũng như kiểu dữ liệu có cấu trúc

Hỗ trợ mảng Mảng được thể hiện qua các qui tắc

ví dụ sử dụng một phần tử bên ngoài

và nội dung của mảng là các phần tử bên trong thông thường tên phần tử bên ngoài sử dụng số nhiều của tên các yếu tố bên trong

Hỗ trợ

Hỗ trợ kiểu đối tượng Đối tượng được thể hiện thông qua

các qui ước, thường sử dụng thông

Hỗ trợ

Trang 13

qua thuộc tính của các phần tử

Hỗ trợ giá trị Null Cần phải sử dụng xsi:nil trên phần tử

Không có khái niệm Namespaces

kích thước

Cú pháp ngắn gọn, các trường định dạng được hầu hết dữ liệu nó biểu diễn

Phân tích cú pháp

trong Javascript

Cần sử dụng XML Dom và các ứng dụng khác để chuyển đổi sang Javascript

Không cần ứng dụng khác để chuyển đổi sang javascript chỉ cần

sử dụng hàm eval trong Javascript

Bảng 1.1 So sánh JSON và XML 1.4 Phân tích JSON

JSON chỉ là một chuỗi văn bản và không phải là một đối tượng nó cần được chuyển đổi sang một đối tượng trước khi làm cho nó trở lên hữu ích Việc phân tích cú pháp có thể được thực hiện với hàm Eval() trong javascript và nó an toàn hơn khi sử dụng một chương trình phân tích cú pháp khác Chúng ta có thể tải về các phân tích cú pháp JSON bằng JavaScript tại địa chỉ http://www.json.org/json.js Tệp tin này bao gồm các hàm cho phép chúng ta tận dụng lợi thế của các đối tượng JSON trong đó có

2 phương thức sau rất hữu ích trong việc phân tích cú pháp của JSON

 JSON.parse(strJSON) - Chuyển một chuỗi JSON thành đối tượng của Javascript

 JSON.stringify(objJSON) - Chuyển đối tượng của Javascript thành chuỗi JSON

Trang 14

Quá trình xử lý việc truyền dữ liệu JSON giữa máy khách và máy chủ được mô tả theo hình 1.6 như sau:

Về phía máy khách:

1 Tạo ra một đối tượng Javascript

2 Sử dụng phương thức stringify để chuyển đối tượng thành một chuỗi JSON

3 Gửi chuỗi địa chỉ URL đã mã hóa(URL-encode) bao gồm chuỗi JSON như một phần của http request đến máy chủ nó có thể sử dụng phương pháp GET, POST để gửi

dữ liệu

Hình 1.6 Quá trình truyền và nhận dữ liệu JSON giữa máy chủ và máy khách

Hình 1.7 Quá trình xử lý dữ liệu JSON tại máy chủ

Trang 15

Về phía máy chủ :

1 Giải mã chuỗi JSON sau đó chuyển chuỗi JSON thành các đối tượng của ngôn ngữ chúng ta chọn

2 Thực hiện xử lý đối tượng theo yêu cầu của bài toán

Nếu muốn gửi lại chuỗi JSON trả về phía máy khách

 Tạo một đối tượng mới để biểu diễn dữ liệu trả về

 Chuyển đối tượng thành chuỗi JSON

 Chuyển chuỗi JSON lại phía máy khách

Về phía máy khách : Sau khi nhận được chuỗi JSON sẽ chuyển chuỗi thành các

đối tượng của Javascript và xử lý các đối tượng theo yêu cầu

Ví dụ đoạn mã dưới đây chỉ ra làm thế nào để gửi dữ liệu JSON đến máy chủ

Trang 17

JSON được ứng dụng trong một số trường hợp sau đây:

 Lưu trữ dữ liệu đơn thuần Đôi khi chúng ta muốn lưu trữ dữ liệu dưới dạng metadata ở phía máy chủ chuỗi JSON sẽ được lưu vào cơ sở dữ liệu và sau đó khi cần

dữ liệu thì sẽ được giải mã Phương pháp lưu trữ dữ liệu này cũng tương tự như sử dụng tính năng serialize và unserialize của các ngôn ngữ lập trình Nhưng trong khi

Trang 18

serialize và unserialize sử dụng với cả dữ liệu và biểu thức và phụ thuộc vào ngôn ngữ lập trình Vì vậy nếu dữ liệu của chúng ta chỉ đơn thuần là dữ liệu cơ bản (chuỗi kí tự, số…) thì hoàn toàn không nên sử dụng serialize mà nên sử dụng JSON

 Sử dụng trong ngôn ngữ JavaScript và ActionScript để xử lý thông tin trả về từ phía máy chủ rất nhanh về dễ dàng

Trang 19

CHƯƠNG 2: TỔNG QUAN KIẾN TRÚC HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU

MYSQL 2.1 Lịch sử của hệ quản trị cơ sở dữ liệu MySQL

MySQL là hệ quản trị cơ sở dữ liệu mã nguồn mở phổ biến nhất thế giới và được các nhà phát triển rất ưa chuộng trong quá trình phát triển ứng dụng MySQL là hệ quản trị cơ sở dữ liệu tốc độ cao, ổn định và dễ sử dụng, có tính linh hoạt, hoạt động trên nhiều hệ điều hành cung cấp một hệ thống lớn các hàm tiện ích rất mạnh Với tốc

độ và tính bảo mật cao nên MySQL rất thích hợp cho các ứng dụng có truy cập CSDL trên Internet Hệ quản trị MySQL miễn phí hoàn Hiện nay MySQL có rất nhiều phiên bản cho các hệ điều hành khác nhau như : phiên bản Win32 cho các hệ điều hành dòng Windows hay các phiên bản khác dành cho các hệ điều hành khác như Linux, Mac OSX, Unix, FreeBSD, NetBSD, Novell Novell NetWare, SGI, Irix, Solaris, SunOS,…

Hệ quản trị CSDL MySQL là hệ quản trị cơ sở dữ liệu quan hệ sử dụng ngôn ngữ truy vấn có cấu trúc (SQL) MySQL thường được sử dụng với các ngôn ngữ lập trình PHP, Perl, và nhiều ngôn ngữ khác Nó làm nơi lưu trữ những thông tin trên các trang web viết bằng PHP hay Perl,

Lịch sử phát triển của MySQL: MySQL khởi đầu với cái tên MySQL AB và

được sáng lập từ ba chàng trai Michael Widenius, David Axmark, và Allan Larsson Công ty này sau đó được Sun Microsystems mua lại với giá 1000$

Trong suốt quá trình lịch sử của MySQL đã có nhiều những mốc quan trọng mà MySQL đồng hành cùng với nền công nghiệp máy tính Trong đó có những mốc nổi bật như sau:

Trang 20

- 2008: MySQL phát hành phiên bản 5.1 Phiên bản này có tính năng phân vùng, lập lịch các sự kiện, sửa lỗi, máy chủ ghi nhật ký các bảng và plugin API

MySQL không dừng lại ở phiên bản 5.1 MySQL 6.0 đã có các công trình thực hiện và sẽ hứa hẹn sẽ có nhiều tính năng mới như toàn vẹn tham chiếu, hỗ trợ unicode

và một số kỹ thuật lưu trữ mới đáp ứng được nhu cầu lưu trữ dữ liệu ngày nay

2.2 So sánh hệ quản trị CSDL MySQL và các hệ quản trị CSDL khác

Điểm khác nhau lớn nhất của MySQL so với các hệ quản trị CSDL khác là MySQL hỗ trợ rất nhiều các kỹ thuật lưu trữ khác nhau Ở phiên bản 5.6 thì MySQL đang hỗ trợ hơn mười kỹ thuật lưu trữ khác nhau như MyISAM, InnoDB, Memory, Merge, CSV, InfoBright… Vì MySQL là mã nguồn mở, tính linh hoạt cao, uyển chuyển nên chúng ta có thể tùy biến để thêm hoặc thay đổi các kỹ thuật để cho có thể phù hợp với từng dạng ứng dụng

Các chức năng khác của MySQL so với các hệ quản trị khác là như nhau như View, StoreProcedure, Trigger, khả năng phục hồi và bảo mật

Một trong các kỹ thuật lưu trữ mới nhất là InfoBright mà cộng đồng mã nguồn

mở xây dựng, đây là một kỹ thuật được dùng nhiều trong miền ứng dụng là các kho dữ liệu Với không gian lưu trữ là rất ít, tối đa có thể đạt 40/1 từ dữ liệu thô đưa vào trong MySQL, tốc độ truy xuất rất nhanh vì kỹ thuật này dùng các thuật toán và phương pháp lưu trữ mới Kết hợp kỹ thuật InfoBright với các kho dữ liệu như Pentaho hay Talend sẽ mang lại những thử nghiệm mới cho các doanh nghiệp xây dựng các ứng dụng kho dữ liệu

Việc so sánh hệ quản trị MySQL với một số hệ quản trị cơ sở dữ liệu khác giúp chúng ta có cái nhìn tổng quan về ưu, nhược điểm của hệ quản trị MySQL Thông tin được đưa ra so sánh như : hệ điều hành hỗ trợ, các tính năng cơ bản, hỗ trợ bảng và khung nhìn, chức năng đính chỉ mục và các đối tượng khác Các bảng từ 2.1 đến 2.5 so sánh các chức năng của hệ quản trị CSDL MySQL với các hệ quản trị CSDL khác

Trang 21

Cây R-/Cây R+

Hàm băm

Biểu thức (lập trình)

Chỉ mục từng phần

Chỉ mục đảo

Bitmap GiST

MySQL Trong SQL

5.0 MyISAM, BDB, hoặc bảng InnoBD

Chỉ có bảng HEAP

Oracle Chỉ có ở

phiên bản EE

Bảng gộp

Bảng 2.4 : So sánh về chức năng chỉ mục 9 Các đối tƣợng khác

Domain Cursor Trigger Hàm Thủ tục External

Trang 22

Nếu theo dõi các bảng từ 2.1 đến 2.5 so sánh giữa ba hệ quản trị cơ sở dữ liệu MySQL, Oracle và PostgreSQL thì thấy rằng hệ quản trị cơ sở dữ liệu MySQL rất mạnh, nó hoạt động được trên hầu hết các hệ điều hành, hỗ trợ rất nhiều tính năng cơ bản, và hỗ trợ rất nhiều kiểu đánh chỉ mục

Khả năng mở rộng là một trong những tính năng của MySQL đó là nó có thể được mở rộng Nếu với những gì mà MySQL cung cấp mà chúng ta vẫn chưa hài lòng, chúng ta có thể thêm vào MySQL những gì phù hợp với ứng dụng của chúng ta Ví dụ chúng ta có thể thêm vào kiểu dữ liệu mới, hàm và toán tử mới và các thủ tục mới

2.3 Tổng quan kiến trúc MySQL

2.3.1 Giới thiệu

Phần này cung cấp một cái nhìn tổng quan kiến trúc máy chủ cài hệ quản trị cơ

sở dữ liệu MySQL Một bức tranh dễ hiểu mô hình các thành phần của MySQL làm việc với nhau như thế nào sẽ giúp chúng ta hiểu về Server này Hình 2.1 chỉ ra cấu trúc logic của kiến trúc MySQL Tầng cao nhất của kiến trúc bao gồm các dịch vụ không phải là duy nhất đối với MySQL Chúng là các dịch vụ mà hầu hết các công cụ dựa trên mạng Client/Server hoặc các máy chủ cần như: điều khiển kết nối, xác thực, an ninh và vv

Tầng thứ hai là nơi mà mọi thứ trở nên đáng quan tâm Phần lớn bộ não của MySQL tập trung ở đây, bao gồm cả mã cho phân tích cú pháp truy vấn, phân tích, tối

ưu hóa, bộ nhớ đệm, và tất cả các chức năng built-in (ví dụ như ngày tháng, thời gian, toán học, và mã hóa) Bất kỳ chức năng được cung cấp cùng với kỹ thuật lưu trữ sẽ tồn tại ở cấp độ này, ví dụ như các thủ tục lưu trữ, triggers, và views

Hình 2.1 Kiến trúc tổng quan của hệ quản trị cơ sở dữ liệu MySQL 11

Trang 23

Lớp thứ ba có chứa các kỹ thuật lưu trữ Chúng có nhiệm vụ lưu trữ và thu hồi tất

cả các dữ liệu được lưu trữ trong MySQL

Cũng giống như các hệ thống tập tin khác nhau cho GNU/Linux, mỗi kỹ thuật lưu trữ có những ưu điểm và nhược điểm của nó Các máy chủ giao tiếp với chúng thông qua các API của kỹ thuật lưu trữ Giao diện này làm ẩn đi sự khác biệt giữa các

kỹ thuật lưu trữ và làm cho chúng phần lớn là minh bạch ở lớp truy vấn API chứa một vài chục chức năng ở mức độ thấp, thực hiện các hoạt động như "bắt đầu một giao dịch" hoặc "nhận hàng dữ liệu có khóa chính này" Các kỹ thuật lưu trữ không phân tích cú pháp SQL hoặc giao tiếp với nhau chúng chỉ đơn giản đáp ứng các yêu cầu từ máy chủ

2.3.2 Quản lý kết nối và an ninh

Khi các máy khách kết nối với máy chủ MySQL, máy chủ cần xác thực chúng Xác thực dựa trên tên đăng nhập, máy chủ nguồn và mật khẩu Xác nhận X.509 cũng

có thể được sử dụng trên một kết nối Secure Sockets Layer (SSL) Khi một máy khách(Client) đã kết nối, máy chủ kiểm tra xem máy khách này có đặc quyền cho mỗi truy vấn mà nó đưa ra hay không (Ví dụ có hay không máy khách được phép phát đi một câu lệnh SELECT để truy cập bảng Country trong cơ sở dữ liệu)

2.3.3 Tối ƣu hóa thực thi

MySQL phân tích các truy vấn để tạo ra một cấu trúc bên trong (cây phân tích cú pháp) và sau đó áp dụng một loạt các tối ưu hóa Việc tối ưu hóa này có thể bao gồm việc viết lại các truy vấn, xác định thứ tự mà nó sẽ đọc các bảng, lựa chọn các chỉ số nào để sử dụng, vv… Chúng ta có thể chuyển các gợi ý tới bộ tối ưu hóa thông qua các từ khóa đặc biệt trong truy vấn, ảnh hưởng đến tiến trình ra quyết định của mình Chúng ta cũng có thể yêu cầu máy chủ để giải thích các khía cạnh khác nhau của việc tối ưu hóa Điều này cho phép chúng ta biết các quyết định của máy chủ đang thực hiện và cung cấp cho chúng ta một điểm tham chiếu cho các truy vấn thực hiện lại, lược đồ, và các thiết lập để làm cho mọi thứ chạy càng hiệu quả càng tốt

Tối ưu hóa không thực sự quan tâm một bảng cụ thể sử dụng kỹ thuật lưu trữ nào nhưng các kỹ thuật lưu trữ ảnh hưởng đến cách mà máy chủ tối ưu hóa truy vấn Bộ tối

ưu hóa yêu cầu kỹ thuật lưu trữ về một số khả năng của mình và phí tổn của một số hoạt động, và số liệu thống kê trên bảng dữ liệu

11

Nguồn: http://java.sun.com/developer/technicalArticles/mysql_acq

Trang 24

Ví dụ, một số kỹ thuật lưu trữ hỗ trợ các loại chỉ số có thể hữu ích cho các truy vấn nhất định

Trước khi phân tích truy vấn mặc dù máy chủ tham khảo bộ nhớ cache truy vấn

mà có thể lưu trữ các câu lệnh SELECT, cùng với các bộ kết quả của chúng Nếu bất

cứ ai đưa ra một truy vấn giống hệt với một truy vấn đã có trong bộ nhớ cache, máy chủ không cần phải phân tích, tối ưu hóa, hoặc thực hiện truy vấn gì mà chỉ đơn giản

là chuyển trở lại tập hợp kết quả được lưu trữ

2.3.4 Kiểm soát đồng thời

Bất cứ khi nào nếu nhiều hơn một truy vấn để thay đổi dữ liệu đồng thời, lúc này

sẽ phát sinh vấn đề kiểm soát đồng thời Mục đích của chúng tôi trong chương này sẽ tìm hiểu về MySQL đã làm điều này ở hai cấp độ: cấp độ máy chủ và cấp độ kỹ thuật lưu trữ Kiểm soát đồng thời là một chủ đề lớn mà phần lớn nội dung lý thuyết của các tài liệu viết về nó, nhưng luận văn này không mang tính lý thuyết hoặc thậm chí không nói về nội tại MySQL Vì vậy, chúng tôi sẽ chỉ cung cấp một cái nhìn tổng quan đã được đơn giản hóa về cách mà MySQL đề cập của chương này

Chúng tôi sẽ sử dụng một hộp thư điện tử trên một hệ thống Unix là một ví dụ Định dạng của tập tin cổ điển Mbox là rất đơn giản Tất cả các thông điệp trong hộp thư mailbox được nối với nhau theo trật tự cái này sau cái kia Điều này làm cho nó rất

dễ dàng để đọc và phân tích các thông điệp thư Nó cũng làm cho chuyển phát thư dễ dàng: chỉ cần nối thêm một tin nhắn mới ở phần cuối của tập tin

Nhưng những gì sẽ xảy ra khi có hai tiến trình cố gắng để chuyển các thông điệp cùng một lúc tới cùng một hộp thư Rõ ràng rằng điều này có thể làm lỗi hộp thư để lại hai tin nhắn xen kẽ vào cuối của tập tin mailbox Các hệ thống phân phối mail sử dụng phương thức khóa để ngăn chặn việc lỗi file này Nếu một khách hàng cố gắng chuyển nhận thư lần thứ hai trong khi hộp thư bị khóa, nó phải chờ đợi để có được khóa riêng của mình trước khi chuyển nhận thông điệp của mình

Phương thức này hoạt động khá tốt trong thực tế nhưng nó lại mang đến sự không hỗ trợ tính đồng thời Bởi vì chỉ có một quá trình duy nhất có thể thay đổi hộp thư tại bất kỳ thời điểm nhất định, phương pháp này sẽ trở thành vấn đề với một hộp thư có dung lượng lớn

2.3.4.1 Khóa Read/Write

Việc đọc từ hộp thư(mail box) không khó Không ổn khi có nhiều khách hàng cùng đọc đồng thời một thư Bởi vì chúng không gây ra sự thay đổi, không có gì bị lỗi Nhưng chuyện gì xảy ra nếu một người nào đó cố để xóa số 25 trong khi các chương

Trang 25

trình khác đang đọc hộp thư đó Vậy để cho an toàn việc đọc hộp thư yêu cầu phải thận trọng

Nếu chúng ta nghĩ rằng một hộp thư như là một bảng trong cơ sở dữ liệu và mỗi thư như là một hàng thì ta dễ dàng nhận thấy vấn đề ở cùng nội dung Với nhiều cách hộp thư thực sự chỉ là một bảng cơ sở dữ liệu đơn giản Việc sửa đổi các hàng trong một bảng cơ sở dữ liệu tương tự như việc xóa hoặc thay đổi nội dung của các thông điệp trong một file hộp thư

Các giải pháp cho vấn đề kinh điển này của việc kiểm soát đồng thời là khá đơn giản Các hệ thống phải đối phó với việc truy cập read/write đồng thời thực hiện một

hệ thống khóa bao gồm hai loại khóa Các khóa này thường được biết đến như việc chia sẻ khóa: khóa riêng biệt hoặc các khóa read/write

Nếu không có đáng lo ngại về ứng dụng khóa thực tế đang sử dụng chúng ta có thể mô tả khái niệm theo các cách sau Việc đọc khóa trên một tài nguyên nào đó phải được chia sẻ, hoặc không khóa lẫn nhau, nhiều client có thể đọc một tài nguyên cùng một thời điểm và không can thiệp với nhau Mặt khác các khóa write là riêng biệt, chúng chặn cả hai khóa write/read bởi vì chỉ các chính sách an toàn rành cho duy nhất khách hàng đang ghi vào tài nguyên ở một thời điểm nhất định và ngăn ngừa tất cả việc đọc khi một khách đang ghi

Trong thế giới cơ sở dữ liệu, việc thực hiện khóa xảy ra tất cả các thời gian: MySQL phải ngăn chặn một khách hàng đọc một phần dữ liệu trong khi người khác đang thay đổi Nó thực hiện quản lý khóa này trong nội bộ theo cách minh bạch trong nhiều thời gian

2.3.4.2 Điều khiển truy cập đồng thời

Khóa phân mảnh là một cách để cải thiện việc đồng thời chia sẻ nguồn tài nguyên chia sẻ và trở nên có chọn lọc hơn về những gì chúng ta khóa Thay vì khóa toàn bộ tài nguyên, ta chỉ cần khóa một phần có chứa các dữ liệu chúng ta cần phải thay đổi Tốt hơn, việc khóa chỉ nên thực hiện chính xác với phần dữ liệu chúng ta có

kế hoạch thay đổi Việc giảm thiểu số lượng dữ liệu mà chúng ta muốn khóa tại một thời điểm, cho phép các thay đổi một nguồn tài nguyên nhất định nào đó xảy ra đồng thời miễn là chúng không xung đột với nhau

Vấn đề là khóa có tiêu thụ hết các tài nguyên Hoạt động khóa tài nguyên bao gồm nhận một khóa, kiểm tra để xem liệu khóa có rỗi hay không, giải phóng một khóa, vv… Nếu hệ thống dành quá nhiều thời gian cho việc quản lý khóa thay vì lưu trữ và lấy dữ liệu thì hiệu suất có thể bị ảnh hưởng Một hoạch định khóa là một sự thỏa hiệp giữa khóa ở trên và an toàn dữ liệu và việc thỏa hiệp này sẽ ảnh hưởng đến hiệu năng

Trang 26

Hầu hết các máy chủ cơ sở dữ liệu dành cho thương mại không cung cấp cho chúng ta nhiều sự lựa chọn: chúng ta sẽ chỉ nhận được cái mà được gọi là khóa mức mức độ hàng ở trong các bảng của chúng ta, với nhiều cách đa dạng và phức tạp sẽ cho ta hiệu suất tốt với nhiều khóa

Nói cách khác, MySQL cung cấp cho ta nhiều sự lựa chọn Các kỹ thuật lưu trữ của nó có thể thực hiện các chính sách khóa của riêng mình và thực hiện tính phân mảnh khóa Việc quản lý khóa là một quyết định rất quan trọng trong việc quyết định thiết kế kỹ thuật lưu trữ, việc cố định các phân mảnh ở một cấp độ nhất định nào đó

có thể cho hiệu suất tốt hơn đối với việc sử dụng nào đó, nhưng lại làm kỹ thuật ít phù hợp cho các mục đích khác Bởi vì MySQL cung cấp nhiều kỹ thuật lưu trữ nó không đòi hỏi một giải pháp tổng thể chung Chúng ta hãy tìm hiểu hai chiến lược khóa quan trọng nhất

Khóa bảng:

- Đây là chiến lược khóa cơ bản nhất có trong MySQL, và với phí thấp nhất Một khóa bảng cũng tương tự như khóa hộp thư như mô tả ở trên: nó khóa toàn bộ bảng Khi một client muốn ghi vào một bảng (chèn, xóa, cập nhật, vv), nó sẽ yêu cầu khóa việc ghi Điều này sẽ giúp tất cả hoạt động đọc và ghi khác tại các vùng tương ứng Khi không hoạt động ghi, bộ đọc có thể có được các khóa đọc, nhưng không xung đột với các khóa đọc khác

- Các khóa bảng có nhiều thay đổi trong các tình huống cụ thể để đạt được hiệu

năng tốt nhất Ví dụ READ LOCAL các khóa bảng cho phép một số loại hoạt động

như ghi ngay tại thời điểm đó Các khóa ghi cũng có độ ưu tiên cao hơn so với khóa đọc vì vậy một yêu cầu khóa ghi sẽ được xếp vào phía trước của hàng đợi khóa ngay

cả khi bộ đọc đã có trong hàng đợi (Các khóa ghi có thể được đưa lên phía trước khóa đọc đã qua trong hàng đợi, nhưng khóa đọc không thể đứng trước khóa ghi đã thực hiện)

- Mặc dù các kỹ thuật lưu trữ có thể quản lý các khóa riêng của chúng MySQL

tự nó cũng sử dụng một loạt các khóa có hiệu quả ở cấp độ bảng cho các mục đích khác nhau Ví dụ: Máy chủ sử dụng một khóa cấp độ bảng cho câu lệnh như ALTER TABLE mà không quan tâm đến các kỹ thuật lưu trữ

Các khóa hàng

Kiểu khóa này cung cấp tính đồng thời lớn nhất (mất phí tổn tài nguyên lớn nhất) Khóa cấp độ hàng như một chiến lược thường hay được biết đến so với các kiểu khác, có sẵn trong InnoDB và trong các kỹ thuật lưu trữ Falcon Các khóa hàng được thực hiện trong kỹ thuật lưu trữ chứ không phải là trong máy chủ Máy chủ hoàn toàn

Trang 27

không biết gì về khóa được thực hiện trong các kỹ thuật lưu trữ tất cả các kỹ thuật lưu trữ sẽ thực hiện khóa theo những cách riêng của chúng

2.3.5 Kiểm soát giao dịch

Một ví dụ kinh điển trong giao dịch

Chúng ta không thể kiểm tra hết tất cả các tính năng tiên tiến của một hệ cơ sở dữ liệu trong thời gian dài trước khi các giao dịch hòa lẫn vào với nhau Giao dịch là một nhóm các câu truy vấn SQL được được xem như nguyên tử, là một đơn vị duy nhất trong công việc Nếu các kỹ thuật cơ sở dữ liệu có thể áp dụng toàn bộ nhóm của các truy vấn cơ sở dữ liệu hay không, cơ sở dữ liệu có thể làm như vậy, nhưng nếu bất kỳ một trong chúng không thể thực hiện được bởi vì bị hỏng hoặc lý do khác, thì không giao dịch nào trong số chúng được áp dụng

Một phần này chỉ rõ MySQL Nếu chúng ta đã quen thuộc với các giao dịch ACID, chúng ta có thể tự bỏ qua phần "giao dịch trong MySQL"

Ứng dụng trong ngân hàng là ví dụ cổ điển về lý do tại sao giao dịch lại cần thiết Hãy tưởng tượng một cơ sở dữ liệu của ngân hàng với hai bảng: trái phiếu và tiết kiệm Để di chuyển $200 từ tài khoản trái phiếu của Jane vào tài khoản tiết kiệm của chính cô ta, chúng ta cần phải thực hiện ít nhất ba bước sau:

b1 Kiểm tra số dư tài khoản của cô đấy là lớn hơn $200

b2 Trừ $200 từ số dư tài khoản trái phiếu của cô đấy

b3 Thêm $200 vào tài khoản tiết kiệm của cô ấy

Toàn bộ hoạt động nên được nằm trong một giao dịch, như vậy nếu có một trong những các bước không thành công, bất kỳ bước nào hoàn thành trước đó đều cần thực hiện lại

Chúng ta bắt đầu một giao dịch với khối lệnh START TRANSACTION, và sau

đó hoặc là thay đổi cố định với COMMIT hoặc loại bỏ các thay đổi với ROLLBACK

Vì vậy, các giao dịch mẫu trong SQL là:

1 START TRANSACTION;

2 SELECT balance FROM checking WHERE customer_id = 10233276;

3 UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;

4 UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;

5 COMMIT;

Tuy nhiên, nếu chỉ riêng việc giao dịch thì không phải là toàn bộ câu chuyện Điều gì sẽ xảy ra nếu máy chủ cơ sở dữ liệu bị lỗi trong khi thực hiện dòng 4 Ai mà

Trang 28

biết được khách hàng có thể mất $200 Và những gì xảy ra nếu đang có quá trình xử lý khác nằm giữa các dòng 3 và 4, và xóa toàn bộ số dư tài khoản trái phiếu Khi đó ngân hàng đã cho khách hàng một khoản tín dụng $200 mà không biết

Giao dịch không đầy đủ trừ khi hệ thống vượt qua các kiểm tra ACID ACID là viết tắt của Atomicity, Consistency, Isolation, và Durability Đây là những tiêu chuẩn liên quan chặt chẽ mà một hệ thống xử lý giao dịch tốt cần phải đáp ứng:

Tính Atomicity

Một giao dịch phải được xem như chức năng của một đơn vị duy nhất trong công việc mà không thể chia nhỏ được nữa, vì thế toàn bộ giao dịch có thể được áp dụng

hoặc là truy ngược lại Khi các giao dịch là Atomicity, đây không phải như những thứ

của một giao dịch hoàn thành một phần: đó là tất cả hoặc không có gì

Tính nhất quán

Cơ sở dữ liệu nên luôn luôn di chuyển từ một trạng thái phù hợp nhất quán đến trạng thái tiếp theo Trong ví dụ của chúng ta, tính nhất quán đảm bảo rằng lỗi giữa dòng 3 và 4 không gây ra thất thoát $200 từ tài khoản trái phiếu Bởi vì việc giao dịch không bao giờ được committed, không có sự thay đổi nào của các giao dịch được phản ánh trong cơ sở dữ liệu

Tính tách biệt

Các kết quả của một giao dịch thường là không thể trông thấy đối với các giao dịch khác cho đến khi giao dịch hoàn thành Điều này đảm bảo rằng nếu một tài khoản ngân hàng chạy sau dòng 3 nhưng trước khi dòng 4 trong ví dụ của chúng ta, nó vẫn sẽ thấy $200 trong tài khoản trái phiếu Khi chúng ta thảo luận về mức độ cách ly, chúng

ta sẽ hiểu lý do tại sao chúng ta thường hay nói về sự không thể trông thấy

Cũng như với việc tăng thêm phân mảnh khóa, nhược điểm của việc bảo mật thêm này là các máy chủ cơ sở dữ liệu phải làm nhiều công việc hơn Một máy chủ cơ

Trang 29

sở dữ liệu với các giao dịch ACID thường đòi hỏi công suất của CPU, bộ nhớ, khoảng trống đĩa nhớ, nhiều hơn so với một server mà không có ACID

Như chúng ta đã nói nhiều lần, đây là nơi kiến trúc của kỹ thuật lưu trữ trong MySQL thực hiện để mang lại lợi ích cho chúng ta Chúng ta có thể quyết định xem ứng dụng của chúng ta cần giao dịch hay không Nếu chúng ta không thực sự cần đến chúng, chúng ta có thể có được hiệu suất cao hơn với một kỹ thuật lưu trữ không giao

có giao dịch ( kiểu lưu trữ MyISAM) cho một số loại truy vấn Chúng ta có thể có thể

sử dụng LOCK TABLES để đưa ra các mức độ bảo vệ chúng ta cần mà không cần có giao dịch Tất cả đó là tùy thuộc vào chúng ta

Các mức tách biệt

Tách biệt thì phức tạp hơn các khóa Chuẩn SQL định nghĩa bốn mức tách biệt với các quy tắc cụ thể mà không nhìn ở bên trong và bên ngoài một giao dịch Các mức tách biệt thấp hơn thường cho phép tính đồng thời cao hơn và có phí tài nguyên thấp hơn Chúng ta hãy xem nhanh bốn mức tách biệt sau:

READ UNCOMMITTED

Ở cấp độ tách biệt READ UNCOMMITTED, các giao dịch có thể hiển thị kết quả của các giao dịch không committed Ở cấp độ này, nhiều vấn đề có thể xảy ra trừ khi chúng ta thực sự biết những gì chúng ta đang làm và có một lý do tốt để làm việc

đó Mức độ này là hiếm khi được sử dụng trong thực tế bởi vì hiệu năng của nó không tốt hơn nhiều so với cấp độ khác những cấp đã có nhiều cải tiến Đọc dữ liệu không committed cũng được biết đến như là một cách đọc rõ ràng

READ COMMITTED

Mức độ tách biệt được mặc định cho hầu hết các hệ thống cơ sở dữ liệu (nhưng không phải MySQL!) là READ COMMITTED Nó đáp ứng được định nghĩa đơn giản của tách biệt được sử dụng trước đó: một giao dịch sẽ chỉ thấy những thay đổi được thực hiện bởi các giao dịch mà đã thực sự committed khi nó bắt đầu, và những thay đổi của nó sẽ không được nhìn thấy bởi giao dịch khác cho đến khi nó đã committed Mức này vẫn cho phép những gì được biết đến như việc đọc không thể lặp lại Điều này có nghĩa là chúng ta có thể chạy cùng một khối lệnh hai lần và xem dữ liệu khác nhau

REPEATABLE READ

REPEATABLE READ sẽ giải quyết vấn đề mà READ UNCOMMITTED cho phép Điều này đảm bảo rằng bất kỳ hàng nào mà giao dịch đọc sẽ "trông giống nhau" trong các lần đọc sau, tuần tự trong cùng một giao dịch, nhưng theo lý thuyết nó vẫn cho phép một vấn đề khó khăn, đó là đọc ảo Đọc ảo đơn giản là có thể xảy ra khi chúng ta chọn một dãy các hàng, một giao dịch khác là chèn một hàng mới vào khoảng

Trang 30

hàng đó, và sau đó chúng ta chọn một khoảng hàng một lần nữa, sau đó chúng ta sẽ thấy hàng ảo InnoDB và Falcon giải quyết vấn đề đọc ảo bằng kiểm soát đồng thời đa phiên bản

REPEATABLE READ

REPEATABLE READ là một mức mặc định về tách biệt giao dịch của MySQL Các kỹ thuật lưu trữ InnoDB và Falcon phải áp dụng thiết lập này Một số kỹ thuật lưu trữ khác cũng làm vậy, nhưng sự lựa chọn tùy thuộc vào kỹ thuật nào

SERIALIZABLE

Mức cao nhất của đặc tính tách biệt, SERIALIZABLE sẽ giải quyết vấn đề đọc

ảo bằng cách bắt buộc các giao dịch phải xếp theo hàng để chúng không thể gây xung đột Tóm lại, SERIALIZABLE tự đặt một khóa trên mỗi dòng mà nó đọc Ở cấp độ này, rất nhiều trường hợp timeout và khóa kết nối có thể xảy ra Chúng ta hiếm khi thấy mọi người sử dụng mức tách biệt này, nhưng các nhu cầu của ứng dụng của chúng ta có thể buộc chúng ta phải chấp nhận tính đồng thời thiên vị cho dữ liệu ổn định mà nó tạo ra Bảng 1 tóm tắt các mức cô lập khác nhau và những hạn chế liên quan tới mỗi mức

Bảng 2.6 Các mức cô lập ANSI SQL 12

Các giao dịch trong MySQL

MySQL AB cung cấp ba kỹ thuật lưu trữ giao dịch: InnoDB, Cluster ndb, và Falcon Một số kỹ thuật của bên thứ ba cũng có sẵn, các công cụ nổi tiếng nhất hiện nay là solidDB và PBXT

12

Nguồn: Baron Schwartz, Peter Zaitsev, Vadim Tkachenko, Jeremy D Zawodny, Arjen Lentz, and Derek J

Balling (2008), “High Performance MySQL, Giâyond Edition”, pp 9

Trang 31

AUTOCOMMIT

MySQL hoạt động dựa theo chế độ mặc định AUTOCOMMIT Điều này có nghĩa rằng, trừ khi chúng ta đã bắt đầu rõ ràng một giao dịch, nó sẽ tự động thực thi mỗi truy vấn trong một giao dịch riêng biệt Chúng ta có thể kích hoạt hoặc vô hiệu hóa chế độ AUTOCOMMIT cho kết nối hiện tại bằng cách thiết lập một biến:

Giá trị 1 và ON là tương đương, như là 0 và OFF Khi chúng ta chạy với

autocommit = 0, chúng ta luôn luôn trong một giao dịch, cho đến khi chúng ta phát đi một tuyên bố COMMIT hoặc ROLLBACK

MySQL> SHOW VARIABLES LIKE 'AUTOCOMMIT';

1 row in set (0.00 giây)

MySQL> SET AUTOCOMMIT = 1;

Sau đó, MySQL bắt đầu một giao dịch mới ngay lập tức Việc thay đổi giá trị của lệnh AUTOCOMMIT không có tác dụng trên các bảng non-transactional, chẳng hạn như bảng MyISAM hoặc bảng bộ nhớ mà các bảng này chủ yếu hoạt động trong chế

độ AUTOCOMMIT Với các lệnh chắc chắn xảy ra khi có hiệu lực trong suốt một giao dịch mở, sẽ gây ra cho MySQL phải commit các giao dịch trước khi chúng thực hiện Đây là những lệnh Data Definition Language (DDL) mà làm thay đổi đáng kể, chẳng hạn như ALTER TABLE, nhưng lệnh LOCK TABLES và một số khối lệnh khác cũng có hiệu ứng này

MySQL cho phép chúng ta thiết lập mức độ tách biệt bằng cách sử dụng các lệnh SET TRANSACTION ISOLATION LEVEL, có hiệu lực thực thi khi giao dịch tiếp theo bắt đầu Chúng ta có thể thiết lập mức độ tách biệt toàn bộ máy chủ trong file cấu hình hoặc chỉ cho phiên làm việc của chúng ta:

MySQL> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

MySQL công nhận tất cả bốn mức độ cô lập theo tiêu chuẩn ANSI và InnoDB hỗ trợ tất cả trong số chúng Các kỹ thuật lưu trữ khác sẽ tùy biến hỗ trợ cho các mức độ tách biệt khác nhau

Ngày đăng: 25/03/2015, 09:50

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w