Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tại sao vòng lặp này không hiển thị một đối tượng cập nhật được đếm sau mỗi năm giây?

Vì API Python DB theo mặc định ở chế độ AUTOCOMMIT =OFF và (ít nhất là đối với MySQLdb) ở mức cô lập REPEATABLE READ. Điều này có nghĩa là đằng sau hậu trường, bạn có một giao dịch cơ sở dữ liệu đang diễn ra (InnoDB là công cụ giao dịch) trong đó quyền truy cập đầu tiên vào hàng đã cho (hoặc thậm chí có thể là bảng, tôi không chắc) sẽ sửa "chế độ xem" của tài nguyên này cho phần còn lại của giao dịch.

Để ngăn chặn hành vi này, bạn phải 'làm mới' giao dịch hiện tại:

  from django.db import transaction


  @transaction.autocommit  
  def my_count():     
      while True:
          transaction.commit()
          print "Number of Things: %d" % Thing.objects.count()
          time.sleep(5)

- lưu ý rằng transaction.autocommit decorator chỉ để vào chế độ quản lý giao dịch (điều này cũng có thể được thực hiện theo cách thủ công bằng cách sử dụng các hàm transaction.enter_transaction_management / left_transaction_managemen).

Một điều nữa - cần lưu ý - autocommit của Django không giống như autocommit mà bạn có trong cơ sở dữ liệu - nó hoàn toàn độc lập. Nhưng điều này nằm ngoài phạm vi cho câu hỏi này.

Đã chỉnh sửa ngày 22/01/2012

Tại đây là "câu trả lời song sinh" cho một câu hỏi tương tự.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql TẢI THÔNG TIN DỮ LIỆU với khóa chính tự động tăng

  2. Kiểm tra xem IP có trong mạng con không

  3. Kết nối MySQL qua đường hầm SSH - làm thế nào để chỉ định máy chủ MySQL khác?

  4. Chúng ta có thể giới hạn số hàng trong bảng trong MySQL không?

  5. Làm thế nào để sử dụng MySQLdb với Python và Django trong OSX 10.6?