Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Tránh xung đột dữ liệu trong access
#11
(11-09-15, 10:56 AM)hoanbhxhls Đã viết:
(09-09-15, 09:36 PM)maidinhdan Đã viết:
(09-09-15, 03:17 PM)quocdung9999 Đã viết: Mình có một số vấn đề muốn hỏi mong mọi người giúp đỡ nhé.

Hiện tại mình đang làm phần mềm access, bên công ty mình khoảng có 200 User, mình dùng link table để kết nối các User để sử dụng cùng một database , vì công ty mình dùng mạng lan nên việc đó thực hiện cũng khá đơn giản...


Email: quocdung1222@gmail.com

Một số góp ý trước khi bắt đầu:

1. Xác định lại khả năng lập trình code của bản thân tới đâu. ( ý này không phải chê bay mà có thể làm bạn bỏ cuộc nửa chừng cho 200 cái User)
2. Việc link table qua LAN đến 200 User sử dụng. Vấn đền này không cần đến 200 đâu, chỉ cần 3 User đăng nhập cùng lúc thôi là đủ làm bạn điên đầu rồi. Bởi lúc đó cần phải giải quyết rất nhiều vấn đề:
- Load chậm, có khi mở mà không lên.
- Lấy số chứng từ hoặc Mã khóa gì đó...

3. Đã là 200 người chứng tỏ công ty bạn rất lớn, mà lớn như vậy đòi hỏi bảo mật phải cao, an toàn. Riêng Access mình nghĩ không phù hợp đâu.

=> Từ 1+2+3 suy ra: Thuê 1 người chuyên lập trình viết mình nghĩ là hay nhất. Tốt nhất viết bằng VB.NET

Thân mến!
-Mình nghĩ kể cả khi viết bằng VB.NET 1 cá nhân viết cho mô hình database tập chung cho 200 người dùng cũng khó mà đáp ứng được
-Nói chung lập trình viên việt nam cơ bản chỉ viết theo mô hình client/server
-Theo mình nên mua phần mềm của các công ty có uy tín,thương hiệu 
-Các hệ thống lớn như ngân hang,bảo hiểm dùng hoàn toàn phần mềm của nước ngoài
-Mô hình lập trình của họ ít nhất là 3 lớp thậm chí là nhiều hơn

thường thì 3 lớp thôi. nhưng thực sự 3 lớp chỉ là kỹ thuật dùng để công tác bảo trì dễ dàng hơn thôi chứ chẳng liên quan gì đến multi user cả.
Chữ ký của thucgia Hix, Access quả nhiên lợi hại !!!! http://vibigaba.esy.es/
ღღღღღTài sản của thucgia (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname
#12
Theo mình vấn đề nằm ở giải thuật. Vì vậy anh chị nên tập trung vào đây để hoàn thiện chương trình của mình.
 
Hệ quản trị Cơ sở dữ liệu và ngôn ngữ chỉ giúp ta những vấn đề sau:
1- Bảo mật. Mình lấy ví vụ với MS SQL server, nó phân lớp user, chia người quản trị dữ liệu (SA) và người sử dụng dữ liệu (user) (read/write..) làm 2 khối riêng. Như vậy, sẽ an toàn hơn rất nhiều so với MS Access vốn tích hợp tất cả trong 1.
2- Dung lượng lưu trữ. Việc này ai dùng Access đều biết. Có thể kết hợp bằng cách cho MS SQL Server làm backend
3- Khả năng chịu lỗi. Các bạn cũng biết là MS Access rất hay corrupt. 
4- Tốc độ xử lý: Từ SQL 2005 trở đi, Microsoft đã theo kịp Oracle trong việc biến MS SQL server thành 1 hệ điều hành chứ không chỉ là hệ quản trị cơ sở dữ liệu. Có nghĩa là nó can thiệp sâu xuống phần cứng để giảm delay do hệ điều hành điều khiển. Trong khi đó, MS Access chỉ đơn thuần là một module của bộ MS Office.
 
Ngoài ra thì đối với xử lý dữ liệu MS Access xử lý khá tốt nếu ta có giải thuật tốt.
Trở lại vấn đề xử lý xung đột, bạn phải có giải thuật cho các vấn đề sau bất kể là đang dùng ngôn ngữ gì, trình quản trị dữ liệu gì:
- Kịch bản khi truy xuất đến dữ liệu. Khi load 1 record lên. Record đó có ai đang sửa không?
- Kịch bản khi tạo 1 record mới. Lưu ý khi cả 2 user cùng tạo record mới thì về mặc lý luận ta giải quyết thế nào, sau đó mới thực hiện lý luận đó.
- Kịch bản khi lưu 1 record.
- Hệ thống bẫy lỗi. Bẫy lỗi tốt sẽ giúp rất nhiều cho user và cả người quản trị.
Mình tin rằng khi bạn trang bị đủ về mặc lý luận rồi bắt tay vào hiện thực nó thì sẽ không gặp khó khăn nữa.

Lấy ví dụ về cách xử lý trong chương trình Scala. http://www.epicor.com/uk/products/iscala.aspx
Họ giải quyết vấn đề như sau:
-          Tạo 1 table lưu trạng thái tất cả user bao gồm: tên user, module, table, record, thời gian
-          Khi 1 user load 1 record, họ sẽ thêm trạng thái vào table trên, tạo các cảnh báo nếu record đã có người dùng…
-          Khi tạo 1 record mới, họ chưa vội tạo khóa chính và cho màn hình nhập liệu kết nối tới 1 table tạm, table này là bản sao cấu trúc so với table chính. Khi lưu record, họ copy data từ table tạm sang table chính, tạo khóa chính…
Trên đây là ví dụ với Scala mình từng dùng. Một số chương trình lớn khác cũng có những giải thuật riêng cho việc này. Nói như vậy để chứng minh quan điểm của mình về tầm quan trọng của giải thuật. Các bạn cần tập trung nghiên cứu theo hướng này. Chỉ khi nào cần cải thiện 4 vấn đề mình nêu ở trên thì hãy nghĩ đến việc thay đổi hệ quản trị cơ sở dữ liệu hoặc chuyển sang ngôn ngữ khác.
Chữ ký của Noname 020
ღღღღღTài sản của Noname (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Minh Tiên , ongke0711 , maidinhdan , tranthanhan1962 , thucgia , MatTroiNguQuen
#13
Thanks rất nhiều!
Chữ ký của quocdung9999 quocdung9999,gia nhập Thủ Thuật Access từ 24-07 -15.
Reply
Những người đã cảm ơn
#14
(09-09-15, 03:17 PM)quocdung9999 Đã viết: - Chào tất cả các bạn!

Mình có một số vấn đề muốn hỏi mong mọi người giúp đỡ nhé.

Hiện tại mình đang làm phần mềm access, bên công ty mình khoảng có 200 User, mình dùng link table để kết nối các User để sử dụng cùng một database , vì công ty mình dùng mạng lan nên việc đó thực hiện cũng khá đơn giản, mình chia ra 2 phần, một phần dữ liệu và phần code và giao diện. Khi người nào muốn sử dụng thì copy phần giao diện về và mình cấp quyền sử dụng trên database đó, nhưng mình có phát sinh một vấn đề xung đột khi 2 người cùng sử dụng Một mã, như một người update một người delete hoặc 2 người cùng update. Mình cũng chưa tìm ra nguyên nhân khắc phục, theo như mình biết nếu CSDL SQL thì có thể bắt được lỗi này, còn access thì mình chưa biết phải làm thế nào. Bạn nào biết cho mình ý kiến với. Rất cảm ơn nếu được giúp đỡ.


Email: quocdung1222@gmail.com

Thanks!
Chào Bạn,

- Trong trường hợp có số lượng lớn người truy xuất đến dữ liệu dùng chung như Bạn,  Bạn vẫn có thể sử dụng Microsoft Access để xây dựng giao diện người dùng, nhưng phần xử lý dữ liệu tốt nhất là dùng SQL Server.
Về cách thức mà một ứng dụng MS. Access làm giao diện người dùng truy xuất đến dữ liệu dùng chung được thiết kế bằng SQL Server: Bạn có thể tham khảo 1 cách tôi đã trao đổi tại chuyên đề sau trên diễn đàn này:
http://thuthuataccess.com/forum/thread-5297.html
Tại chuyên đề này tôi cũng có trình bày khá cụ thể vấn đề tránh xung đột dữ liệu khi có nhiều người cùng truy xuất 1 dữ liệu dùng chung qua mạng máy tính.

- Về vấn đề bản quyền khi sử dụng SQL Server:
+ Bạn có thể sử dụng bản Express của Microsoft SQL Server, thí dụ như Microsoft SQL Server 2012 Express: http://www.microsoft.com/en-us/download/...x?id=29062
Đây là bản miễn phí hoàn toàn và hợp pháp.

- Bạn cũng nên tham khảo thêm các hạn chế của 1 file dữ liệu được thiết kế bằng MS. Access tại các link sau:
1. http://webcheatsheet.com/sql/access_spec...n.php#1997
2. https://support.office.com/en-us/article...9dff1fa854

Chúc Bạn sức khỏe và thành công.
Chữ ký của lehongduc Lê Hồng Đức
Số ĐT: 0913.941.144
Email: lhongduc@gmail.com, lehongduc@ymail.com
Website: http://quantribanhang.vn
Reply
Những người đã cảm ơn thucgia , Minh Tiên , jeck09nt
#15
(11-09-15, 05:41 PM)Noname Đã viết: Theo mình vấn đề nằm ở giải thuật. Vì vậy anh chị nên tập trung vào đây để hoàn thiện chương trình của mình.
 
Hệ quản trị Cơ sở dữ liệu và ngôn ngữ chỉ giúp ta những vấn đề sau:
1- Bảo mật. Mình lấy ví vụ với MS SQL server, nó phân lớp user, chia người quản trị dữ liệu (SA) và người sử dụng dữ liệu (user) (read/write..) làm 2 khối riêng. Như vậy, sẽ an toàn hơn rất nhiều so với MS Access vốn tích hợp tất cả trong 1.
2- Dung lượng lưu trữ. Việc này ai dùng Access đều biết. Có thể kết hợp bằng cách cho MS SQL Server làm backend
3- Khả năng chịu lỗi. Các bạn cũng biết là MS Access rất hay corrupt. 
4- Tốc độ xử lý: Từ SQL 2005 trở đi, Microsoft đã theo kịp Oracle trong việc biến MS SQL server thành 1 hệ điều hành chứ không chỉ là hệ quản trị cơ sở dữ liệu. Có nghĩa là nó can thiệp sâu xuống phần cứng để giảm delay do hệ điều hành điều khiển. Trong khi đó, MS Access chỉ đơn thuần là một module của bộ MS Office.
 
Ngoài ra thì đối với xử lý dữ liệu MS Access xử lý khá tốt nếu ta có giải thuật tốt.
Trở lại vấn đề xử lý xung đột, bạn phải có giải thuật cho các vấn đề sau bất kể là đang dùng ngôn ngữ gì, trình quản trị dữ liệu gì:
- Kịch bản khi truy xuất đến dữ liệu. Khi load 1 record lên. Record đó có ai đang sửa không?
- Kịch bản khi tạo 1 record mới. Lưu ý khi cả 2 user cùng tạo record mới thì về mặc lý luận ta giải quyết thế nào, sau đó mới thực hiện lý luận đó.
- Kịch bản khi lưu 1 record.
- Hệ thống bẫy lỗi. Bẫy lỗi tốt sẽ giúp rất nhiều cho user và cả người quản trị.
Mình tin rằng khi bạn trang bị đủ về mặc lý luận rồi bắt tay vào hiện thực nó thì sẽ không gặp khó khăn nữa.

Lấy ví dụ về cách xử lý trong chương trình Scala. http://www.epicor.com/uk/products/iscala.aspx
Họ giải quyết vấn đề như sau:
-          Tạo 1 table lưu trạng thái tất cả user bao gồm: tên user, module, table, record, thời gian
-          Khi 1 user load 1 record, họ sẽ thêm trạng thái vào table trên, tạo các cảnh báo nếu record đã có người dùng…
-          Khi tạo 1 record mới, họ chưa vội tạo khóa chính và cho màn hình nhập liệu kết nối tới 1 table tạm, table này là bản sao cấu trúc so với table chính. Khi lưu record, họ copy data từ table tạm sang table chính, tạo khóa chính…
Trên đây là ví dụ với Scala mình từng dùng. Một số chương trình lớn khác cũng có những giải thuật riêng cho việc này. Nói như vậy để chứng minh quan điểm của mình về tầm quan trọng của giải thuật. Các bạn cần tập trung nghiên cứu theo hướng này. Chỉ khi nào cần cải thiện 4 vấn đề mình nêu ở trên thì hãy nghĩ đến việc thay đổi hệ quản trị cơ sở dữ liệu hoặc chuyển sang ngôn ngữ khác.

Theo mình thì đơn giản thế này:

-1,Tất cả kết nối sẽ dùng dạng disconnect (Tất cả bảng sau khi load về client đều được ngắt kết nối)
-2, Tất cả đoạn code ínert dữ liệu sẽ được kẹp giữa BeginTrans   và CommitTrans như bên dưới

Hĩ nghĩ thế nhưng chưa có điều kiện thử!!!!

Mã:
Public Function CreateOrder(lngCompanyID As Long)
On Error GoTo ErrorHandler
Dim ws As DAO.Workspace
Dim db As DAO.Database

Set ws = DBEngine.Workspaces(0) 'Use default workspace
Set db = ws.Databases(0) 'Use default database
With db    
   ws.BeginTrans
   .Execute "...", dbFailOnError 'Some SQL statements
   .Execute "...", dbFailOnError 'More SQL statements
   '... do whatever else needs to be done within the transaction.
   ws.CommitTrans
End With
ExitProcedure:
   Set db = Nothing
   Set ws = Nothing
   Exit Function
ErrorHandler:
   MsgBox Err.Description, vbInformation, "ErrorL"
   ws.Rollback
   Resume ExitProcedure
End Function
Chữ ký của thucgia Hix, Access quả nhiên lợi hại !!!! http://vibigaba.esy.es/
ღღღღღTài sản của thucgia (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Minh Tiên
#16
(11-09-15, 05:41 PM)Noname Đã viết: Theo mình vấn đề nằm ở giải thuật. Vì vậy anh chị nên tập trung vào đây để hoàn thiện chương trình của mình.
 
Hệ quản trị Cơ sở dữ liệu và ngôn ngữ chỉ giúp ta những vấn đề sau:
1- Bảo mật. Mình lấy ví vụ với MS SQL server, nó phân lớp user, chia người quản trị dữ liệu (SA) và người sử dụng dữ liệu (user) (read/write..) làm 2 khối riêng. Như vậy, sẽ an toàn hơn rất nhiều so với MS Access vốn tích hợp tất cả trong 1.
2- Dung lượng lưu trữ. Việc này ai dùng Access đều biết. Có thể kết hợp bằng cách cho MS SQL Server làm backend
3- Khả năng chịu lỗi. Các bạn cũng biết là MS Access rất hay corrupt. 
4- Tốc độ xử lý: Từ SQL 2005 trở đi, Microsoft đã theo kịp Oracle trong việc biến MS SQL server thành 1 hệ điều hành chứ không chỉ là hệ quản trị cơ sở dữ liệu. Có nghĩa là nó can thiệp sâu xuống phần cứng để giảm delay do hệ điều hành điều khiển. Trong khi đó, MS Access chỉ đơn thuần là một module của bộ MS Office.
 
Ngoài ra thì đối với xử lý dữ liệu MS Access xử lý khá tốt nếu ta có giải thuật tốt.
Trở lại vấn đề xử lý xung đột, bạn phải có giải thuật cho các vấn đề sau bất kể là đang dùng ngôn ngữ gì, trình quản trị dữ liệu gì:
- Kịch bản khi truy xuất đến dữ liệu. Khi load 1 record lên. Record đó có ai đang sửa không?
- Kịch bản khi tạo 1 record mới. Lưu ý khi cả 2 user cùng tạo record mới thì về mặc lý luận ta giải quyết thế nào, sau đó mới thực hiện lý luận đó.
- Kịch bản khi lưu 1 record.
- Hệ thống bẫy lỗi. Bẫy lỗi tốt sẽ giúp rất nhiều cho user và cả người quản trị.
Mình tin rằng khi bạn trang bị đủ về mặc lý luận rồi bắt tay vào hiện thực nó thì sẽ không gặp khó khăn nữa.

Lấy ví dụ về cách xử lý trong chương trình Scala. http://www.epicor.com/uk/products/iscala.aspx
Họ giải quyết vấn đề như sau:
-          Tạo 1 table lưu trạng thái tất cả user bao gồm: tên user, module, table, record, thời gian
-          Khi 1 user load 1 record, họ sẽ thêm trạng thái vào table trên, tạo các cảnh báo nếu record đã có người dùng…
-          Khi tạo 1 record mới, họ chưa vội tạo khóa chính và cho màn hình nhập liệu kết nối tới 1 table tạm, table này là bản sao cấu trúc so với table chính. Khi lưu record, họ copy data từ table tạm sang table chính, tạo khóa chính…
Trên đây là ví dụ với Scala mình từng dùng. Một số chương trình lớn khác cũng có những giải thuật riêng cho việc này. Nói như vậy để chứng minh quan điểm của mình về tầm quan trọng của giải thuật. Các bạn cần tập trung nghiên cứu theo hướng này. Chỉ khi nào cần cải thiện 4 vấn đề mình nêu ở trên thì hãy nghĩ đến việc thay đổi hệ quản trị cơ sở dữ liệu hoặc chuyển sang ngôn ngữ khác.

Theo mình thì đơn giản thế này:

-1,Tất cả kết nối sẽ dùng dạng disconnect (Tất cả bảng sau khi load về client đều được ngắt kết nối)
-2, Tất cả đoạn code ínert dữ liệu sẽ được kẹp giữa BeginTrans   và CommitTrans như bên dưới

kết quả là em nào them du lieu mà chay suôn sẽ từ BeginTrans   và CommitTrans sẽ thành công còn em nào rủi, khi thêm vào có một tiến trình đang thực hiện sẽ phải rollback và chạy lại. Vì thế trong chương trình khi chúng ta viết phải thể hiện cái này luôn: thông báo cập nhật thành công....hoac that bai...
Ví dụ thấy trước mắt là trang thuthuâtcceess này cũng dùng cơ chế như vậy
Hĩ nghĩ thế nhưng chưa có điều kiện thử!!!!

Mã:
Public Function CreateOrder(lngCompanyID As Long)
On Error GoTo ErrorHandler
Dim ws As DAO.Workspace
Dim db As DAO.Database

Set ws = DBEngine.Workspaces(0) 'Use default workspace
Set db = ws.Databases(0) 'Use default database
With db    
   ws.BeginTrans
   .Execute "...", dbFailOnError 'Some SQL statements
   .Execute "...", dbFailOnError 'More SQL statements
   '... do whatever else needs to be done within the transaction.
   ws.CommitTrans
End With
ExitProcedure:
   Set db = Nothing
   Set ws = Nothing
   Exit Function
ErrorHandler:
   MsgBox Err.Description, vbInformation, "ErrorL"
   ws.Rollback
   Resume ExitProcedure
End Function


ps: Sao anh em mình không thử 1 cái nhỉ , làm một table đơn giản thôi, đặt trên cái máy chủ nào nó : rồi vài chục người hẹn một lúc bùm thử xem em nào insert được là biết ngay. okay không? hôm nào thử? 027
Chữ ký của thucgia Hix, Access quả nhiên lợi hại !!!! http://vibigaba.esy.es/
ღღღღღTài sản của thucgia (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , maidinhdan


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
Question [Help] Link tất các table trong một file.mdb bằng VBA MinhnHang 9 242 09-12-16, 06:11 PM
Bài mới nhất: maidinhdan
  [Thủ Thuật] Tìm số thứ tự bị thiếu trong dãy toanle 8 205 07-12-16, 02:25 PM
Bài mới nhất: toanle
  [Hỏi] Kết nối nhiều lần hay kết nối 1 lần trong ADO ưu điểm hơn Minh Tiên 1 125 10-11-16, 10:41 AM
Bài mới nhất: maidinhdan
  Summary bằng VBA trong MS Access. MinhnHang 6 321 08-11-16, 08:36 AM
Bài mới nhất: MinhnHang
  [Hỏi] Số Thứ Tự Theo Nhóm Hàng Hóa Trong Access pherotao 2 148 02-11-16, 03:05 PM
Bài mới nhất: pherotao

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ