thắc mắc [Java] Thắc mắc về Java

đương nhiên là nên dùng lock mysql. còn ví dụ của my fen ý là sao, tôi k hiểu lắm nhỉ? thằng thread đầu tiên update record thì nó lock row, những thread sau pending cho đến khi timeout hoặc thằng #1 done tùy điều kiện nào đến trước... nên là những thằng sau sửa được nhưng tính đúng đắn thì phụ thuộc vào thứ tự của transactions.
Em định để tất cả các luồng dùng chung 1 đối tượng kết nối, và khi luồng nào dùng phương thức kết nối thì các luồng khác sẽ phải chờ, và nếu k dùng cách đó thì e sẽ dùng mỗi luồng 1 đối tượng kết nối riêng, và sẽ lock table. Nhưng đang phân vân không biết các dev chuyên nghiệp, app lớn thì dùng cách nào để tối ưu hiệu suất và tránh đụng độ
 
Em định để tất cả các luồng dùng chung 1 đối tượng kết nối, và khi luồng nào dùng phương thức kết nối thì các luồng khác sẽ phải chờ, và nếu k dùng cách đó thì e sẽ dùng mỗi luồng 1 đối tượng kết nối riêng, và sẽ lock table. Nhưng đang phân vân không biết các dev chuyên nghiệp, app lớn thì dùng cách nào để tối ưu hiệu suất và tránh đụng độ
use case của fen là gì, chứ như này thì multi thread có tác dụng gì đâu, connection chỉ có 1 thằng hold còn lại chờ :angry:
 
Ở hcm thì rảnh rủ mình ra mình chỉ vài trick lỏ để newbie học cho nhanh
Trình minh kém nên chỉ chắc không master được như mấy thím khác
thím masterr java k ? e xin nhận làm đệ
JEWoIdl.png
 
Em định để tất cả các luồng dùng chung 1 đối tượng kết nối, và khi luồng nào dùng phương thức kết nối thì các luồng khác sẽ phải chờ, và nếu k dùng cách đó thì e sẽ dùng mỗi luồng 1 đối tượng kết nối riêng, và sẽ lock table. Nhưng đang phân vân không biết các dev chuyên nghiệp, app lớn thì dùng cách nào để tối ưu hiệu suất và tránh đụng độ
Bạn sử dụng pessimistic lock hoặc optimistic lock của Mysql
Pessimistic lock sẽ đảm bảo dữ liệu không bị dirty read, dirty write. Các request sẽ được xếp hàng hết request này đến request khác
Optimistic lock sẽ đảm bảo cho bạn không bị dirty write, khi bạn cố gắng update một row mà nó đã bị thay đổi từ lúc bạn đọc thì bạn sẽ nhận về error.

Use case:
Pessimistic lock: sử dụng khi đụng độ xảy ra nhiều, chi phí để retry transaction tốn kém. Ví dụ như trấnction giao dịch ngân hàng
Optimistic lock: sử dụng khi đụng độ it khi xảy ra và chi phí để retry transaction thấp

Còn có một pattern nâng cao nữa là sử dụng optimistic lock kết hợp retry pattern.

Chúc bạn chọn được giải pháp phù hợp
 
các bác cho em hỏi, em đang làm việc với Thread và mysql, e có thắc mắc là nên dùng lock table trong mysql hay dùng synchonized để đồng bộ trong ứng dụng java? Ví dụ các Thread đều kết nối đến cùng một cơ sở dữ liệu và cùng cập nhật ở 1 dòng của 1 table cùng một lúc, thằng đầu tiên sửa trước thì tất cả thằng sau sẽ không thể sửa được dòng đó nữa
Dùng optimistic lock (MySQL) là được nha bác, và nên lock trên row cần update chứ không cần phải lock cả table, Nhưng nếu tất cả các thread chỉ update 1 record trong thời gian dài thì dễ gây bottleneck. Synchronized sẽ không giải quyết được vấn đề khi bạn scale lên nhiều process trên môi trường production.

Em định để tất cả các luồng dùng chung 1 đối tượng kết nối, và khi luồng nào dùng phương thức kết nối thì các luồng khác sẽ phải chờ, và nếu k dùng cách đó thì e sẽ dùng mỗi luồng 1 đối tượng kết nối riêng, và sẽ lock table. Nhưng đang phân vân không biết các dev chuyên nghiệp, app lớn thì dùng cách nào để tối ưu hiệu suất và tránh đụng độ
Cách dễ nhất để tối ưu hiệu suất lúc làm việc với csdl là dùng connection pool để giảm thời gian thiết lập kết nối. Ngoài ra còn có thể sử dụng các thư viện bất đồng bộ - async (RxJava, SmallRye Mutiny) để tối ưu CPU utilization.

Theo kinh nghiệm cá nhân thì mình thấy optimistic locking đủ tốt để giải quyết phần lớn vấn đề.
 
Dùng optimistic lock (MySQL) là được nha bác, và nên lock trên row cần update chứ không cần phải lock cả table, Nhưng nếu tất cả các thread chỉ update 1 record trong thời gian dài thì dễ gây bottleneck. Synchronized sẽ không giải quyết được vấn đề khi bạn scale lên nhiều process trên môi trường production.
cái này thì fen xử thế nào

ví dụ update số lượng sản phẩm đặt hàng của thương mại điện tử, 1 sp sẽ có rất nhiều đơn đặt hàng cùng lúc, vd lúc sale

giải pháp của tôi là chia số lượng thành batch, vd 100, 100k sp sẽ có 1k batch, vậy khi update 1sp thì tôi sẽ là update 1k cái record kia, chia bottle neck thành 1000 lần :D, và nhân độ khó cho maintain lên 1000 lần :D

hoặc maintain 1 cái table order riêng, ko update sp nữa mà validate là cộng tổng của order, chấp nhận có sai số, vậy là ko lock gì hết
 
cái này thì fen xử thế nào

ví dụ update số lượng sản phẩm đặt hàng của thương mại điện tử, 1 sp sẽ có rất nhiều đơn đặt hàng cùng lúc, vd lúc sale

giải pháp của tôi là chia số lượng thành batch, vd 100, 100k sp sẽ có 1k batch, vậy khi update 1sp thì tôi sẽ là update 1k cái record kia, chia bottle neck thành 1000 lần :D, và nhân độ khó cho maintain lên 1000 lần :D

hoặc maintain 1 cái table order riêng, ko update sp nữa mà validate là cộng tổng của order, chấp nhận có sai số, vậy là ko lock gì hết
lúc thanh toán thì cho vào queue hết và update tuần tự. Mình có thể tính toán số lượng stock mà không cần update vào đb liên tục. Tính xong rồi flush vào db hoặc tính vào luôn db cũng đc. Đến khi nào stock về 0 thì thôi
 
cái này thì fen xử thế nào

ví dụ update số lượng sản phẩm đặt hàng của thương mại điện tử, 1 sp sẽ có rất nhiều đơn đặt hàng cùng lúc, vd lúc sale

giải pháp của tôi là chia số lượng thành batch, vd 100, 100k sp sẽ có 1k batch, vậy khi update 1sp thì tôi sẽ là update 1k cái record kia, chia bottle neck thành 1000 lần :D, và nhân độ khó cho maintain lên 1000 lần :D

hoặc maintain 1 cái table order riêng, ko update sp nữa mà validate là cộng tổng của order, chấp nhận có sai số, vậy là ko lock gì hết
Khi scale nhiều instance, người ta áp dụng thêm queue và distributed lock ví dụ như redis.
Request nào lấy đc khóa thì mới được thực thi transaction, tránh đc deadlock khi có nhiều transaction đồng thời

via theNEXTvoz for iPhone
 
Khi scale nhiều instance, người ta áp dụng thêm queue và distributed lock ví dụ như redis.
Request nào lấy đc khóa thì mới được thực thi transaction, tránh đc deadlock khi có nhiều transaction đồng thời

via theNEXTvoz for iPhone
1000 request 1 lúc block 1 cái key thì chết

Lock theo instance thôi chứ

lock nó down performance vl, fen ở trên dùng queue để tránh lock cũng là 1 cách
 
em tìm hiểu thì sử dụng khóa lạc quan (optimistic lock), tức các transaction sẽ được truy cập đồng thời để mua sản phẩm. Tuy nhiên trong số đó chỉ có 1 transaction thành công và đồng thời nó sẽ update một identifier trong bản ghi (thường đặt là version), các transaction vô sau khi phát hiện bản ghi đã được update (version thay đổi) thì sẽ chặn ko cho thực hiện transaction đó nữa. Nhưng mà em không biết cách này có nhược điểm như thế nào, vấn đề gì mình phải lường trước, hóng các tiền bối chia sẻ thêm.
 
em tìm hiểu thì sử dụng khóa lạc quan (optimistic lock), tức các transaction sẽ được truy cập đồng thời để mua sản phẩm. Tuy nhiên trong số đó chỉ có 1 transaction thành công và đồng thời nó sẽ update một identifier trong bản ghi (thường đặt là version), các transaction vô sau khi phát hiện bản ghi đã được update (version thay đổi) thì sẽ chặn ko cho thực hiện transaction đó nữa. Nhưng mà em không biết cách này có nhược điểm như thế nào, vấn đề gì mình phải lường trước, hóng các tiền bối chia sẻ thêm.
Ví dụ nhé, sản phẩm sp1 có 1000 đơn vị

Có 900 order đúng thời điểm t1 thì order 01 lock record sp1 để update đơn vị, và có 899 order phải retry

Kể cả ko phải đồng thời t1, mà trong khoảng thời gian ngắn, VD 1 giây thì cũng có nhiều order bị retry

Cái retry này nó gây áp lực sang các order sau
 
Back
Top