Avatar
0
Nguyễn Thái Sơn Professional
Nguyễn Thái Sơn Professional
Làm chức năng chuyển tiền
Em muốn thiết kế 1 chức năng transfer money đơn giản như này có rủi ro gì k ạ <p> </p> <pre> @Transaction &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; transferMoney(&lt;span&gt;Long&lt;/span&gt; start, &lt;span&gt;Long&lt;/span&gt; destination, &lt;span&gt;Double&lt;/span&gt; cost) { &lt;span&gt;if&lt;/span&gt; (start.getCost &lt; cost ) -&gt; &lt;span&gt;throw&lt;/span&gt; exception(Bạn k đủ tiền) &lt;span&gt;try&lt;/span&gt; { trừ tiền của start gọi API phía destination cộng tiền cho destination } &lt;span&gt;catch&lt;/span&gt; { &lt;span&gt;throw&lt;/span&gt; lỗi roll back DB của start gọi API trừ tiền của end } } </pre>
Answer
Avatar
1
Cesc Nguyễn Beginner
Cesc Nguyễn Beginner
Xử lý vấn đề Transaction trên nhiều Repositories
Hi anh chị em, chắc hẳn mọi người đã sử dụng Repository pattern rất nhiều trong lập trình rồi. Em cũng vậy, tuy nhiên em đang gặp phải một vấn đề về việc khi muốn transaction trên nhiều repositories, thì mình nên xử lý thế nào cho hiệu quả. Anh chị em có thể chia sẻ cùng em ở đây nhé ạ. Cảm ơn mọi người.
Answer
Avatar
0
Nguyễn Thái Sơn Professional
Nguyễn Thái Sơn Professional
deadlock thực tế
Hôm trước em có bài toán Transaction bị deadlock nhưng lần này em chia sẻ cụ thể hơn <p> </p> <p> Ở cùng 1 thời điểm, có 2 transaction A và B xảy ra đồng thời </p> <p> </p> <p> A sẽ update record có id = 1 ở bảng user sau đó update record có id = 2 ở bảng address </p> <p> </p> <p> B sẽ update record có id = 2 ở bảng address và update record có id = 1 ở bảng user </p> <p> </p> <p> Vậy là deadlock, để tránh thì đơn giản em sẽ quy ước trong Transaction gọi bảng nào trước bảng nào để tránh deadlock, nhưng như vậy quá khó vì 1 hệ thống có trăm bảng, không thế nhớ hết như vậy được. Nếu là anh, anh sẽ làm gì </p>
Answer
Avatar
0
toilahtc Beginner
toilahtc Beginner
transaction: có thể thực thi câu lệnh sql trong transaction nếu có exception xảy ra không
Giả sử: trong 1 transaction có 2 câu lệnh insert A và B <p> </p> <ul> <li>insert A : ok </li> <li>insert B:  exception </li></ul> <p> </p> <p> Liệu có cách nào để vẫn thực thi câu lệnh insert A không ạ? </p>
Answer
Avatar
1
Nguyễn Thái Sơn Professional
Nguyễn Thái Sơn Professional
tránh deadlock với Transaction trong Database
Anh ơi, khi 1 ứng dụng có 2 thread Update  2 bảng A đến B và B đến A với cùng 1 record sẽ xảy ra deadlock, điều này không tránh khỏi. 2 thread sẽ chờ nhau nhả khoá dẫn đến cả 2 transaction không bao giờ được commit. Vậy khi gặp trường hợp này anh làm cách nào ngoài việc restart Database. Để tránh deadlock, đa số mọi người sẽ khuyên các thao tác update Database trong 1 transaction luôn cùng thứ tự, ví dụ như A đến B như trong ví dụ trên. Như vậy với 1 hệ thống hàng chục, hàng trăm bảng khi ta làm việc với Transaction, muốn tránh deadlock thì  dev phải quy ước phải update bảng nào trước bảng nào, như vậy liệu có ổn không ạ. Người developer sẽ phải ghi nhớ, kiểm tra nên update bảng nào trước, bảng nào. Anh có phương án nào cho việc này không ạ
Answer