2010-02-15 22 views
5

Chúng tôi có một hệ thống mà trong đó chúng ta phải sử dụng khóa bi quan trong một thực thể. Chúng tôi đang sử dụng ngủ đông, vì vậy chúng tôi sử dụng LockMode.UPGRADE. Tuy nhiên, nó không khóa."CHỌN ... CHO CẬP NHẬT" không hoạt động cho Hibernate và MySQL

  • Các bảng là InnoDB
  • Chúng tôi đã kiểm tra rằng khóa công trình một cách chính xác trong cơ sở dữ liệu (5.0.32), do đó lỗi này http://bugs.mysql.com/bug.php?id=18184 dường như không có vấn đề.
  • Chúng tôi đã kiểm tra nguồn dữ liệu đó bao gồm thông số autoCommit = false.
  • Chúng tôi đã kiểm tra rằng SQL hibernate (phiên bản 3.2) tạo ra bao gồm "FOR UPDATE".

Cảm ơn,

+0

Chúng tôi đã tìm thấy cùng một vấn đề trong các diễn đàn hibernate, https://forum.hibernate.org/viewtopic.php?f=1&t=996902, nhưng không có câu trả lời. –

+0

Làm thế nào để bạn nói rằng nó không khóa? và kể từ khi ngủ đông đã tạo ra các truy vấn thích hợp, vấn đề là trong cơ sở dữ liệu tôi đoán. – Bozho

+0

Bởi vì khóa bi quan được sử dụng để tạo ra một chuỗi trnasactional và các giá trị trùng lặp đang được khái quát. Sử dụng cùng một SQL trong một phiên tương tác có hiệu quả khóa, do đó, nó có vẻ là một số vấn đề trong cách kết nối được thực hiện hoặc phiên quản lý. –

Trả lời

1

Tôi đang chạy vào một cái gì đó rất giống nhau. Tôi đang sử dụng chú thích @Transactional trong Spring và tôi đang phát hành lựa chọn cập nhật và khóa cập nhật không được mua lại (tôi có các luồng khác đang phát hành cùng một lựa chọn để cập nhật và đã xác minh rằng chúng không chặn một cái khóa). Khi tôi một cách rõ ràng có được phiên Hibernate và ban hành một beginTransaction và cam kết xung quanh khối mã, tất cả đều hoạt động.

này không cho tôi một cảm giác ấm áp và mờ về các giao dịch được quản lý container Spring.

1

Khi tôi đã có vấn đề tương tự, đó là bởi vì tôi đã có giao dịch Xuân quản lý cấu hình sai. Kiểm tra lại cấu hình Spring tx của bạn.

<tx:annotation-driven transaction-manager="txManager"/> 
<bean id="txManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

Thực tế là bạn cần autocommit = false cũng có thể cho biết bạn không hoạt động trong giao dịch. Bạn cũng có được các ngoại lệ khởi tạo lười biếng khi bạn cố truy cập các bộ sưu tập một đến nhiều không?

Cách trực tiếp nhất mà tôi đã tìm thấy để tìm hiểu xem các khía cạnh mùa xuân tx đang thực sự làm việc là sử dụng trình gỡ lỗi. Đặt điểm ngắt trong phương thức phát hành câu lệnh SQL FOR UPDATE. Upstack cho đến khi bạn nhấn lớp học/phương pháp @Transactional của bạn. Bạn sẽ thấy proxy khía cạnh Spring trong lần gọi tiếp theo trong ngăn xếp cuộc gọi.

0

Gần đây tôi đã gặp sự cố như thế này. Chúng tôi làm việc với các nhà quản lý 2 tx, chúng tôi có cơ sở dữ liệu khác nhau và vấn đề là giao dịch sử dụng txmanager được cấu hình cho cơ sở dữ liệu khác và do đó kết nối tới cơ sở dữ liệu được truy vấn không bị vô hiệu hóa chế độ tự động trước khi thực hiện lựa chọn để cập nhật. Sử dụng đúng txmanager đã giải quyết điều đó. Hy vọng nó sẽ giúp người khác trong tương lai.

Các vấn đề liên quan