Tôi xác nhận rằng việc chỉ thay đổi bảng trình tự MyISAM thành InnoDB khiến các khóa cập nhật được tạo trên các bảng trình tự sau khi update...set...=last_insert_id()
tuyên bố nhưng trước khi giao dịch đã được cam kết. Các khóa này không được tạo khi sử dụng chuỗi MyISAM. Vì vậy, cách tiếp cận "dễ dàng" có thể có tác động tiêu cực đến hiệu suất.
Đây là những gì tôi nghĩ ra. Không chắc rằng đây là cách dễ nhất, nhưng nó đang hoạt động.
- Per điều này
trả lời, thả các bảng trình tự hiện có và xác định lại chúng bằng một cột duy nhất
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
- Tạo một thủ tục được lưu trữ:a) lấy tên chuỗi làm đối số, b) chèn vào chuỗi và c) trả về LAST_INSERT_ID ()
- Viết một lớp java mở rộng
MySQLMaxValueIncrementer
và gọi thủ tục được lưu trữ tronggetNextKey()
phương pháp. Tôi đang sử dụngSimpleJdbcCall
ví dụ để làm điều này. - Viết một lớp java triển khai
DataFieldMaxValueIncrementerFactory
và trả về một phiên bản từ bước # 3 từgetIncrementer()
phương pháp - Trong cấu hình lô, cập nhật
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean
cấu hình để sử dụng nhà máy sản xuất bộ tăng từ bước # 4