Tôi nghĩ rằng vấn đề là khi gọi exec()
không cho mẫu biết rằng bạn thực sự đã hoàn thành kết nối nên không thể quay lại nhóm.
Theo các tài liệu, bạn phải bọc mã của mình trong một SessionCallback và thực thi nó với RedisTemplate.execute(SessionCallback<T> callback)
điều này sẽ trả lại kết nối đến nhóm sau khi lệnh gọi lại của bạn đã được thực thi.
Như thế này:
template.execute(new SessionCallback<List<Object>>() {
public List<Object> execute(RedisOperations operations) throws DataAccessException {
operations.multi();
aMap.put(A_KEY, a.toString(), a);
bMap.put(B_KEY, b.toString(), b);
cMap.put(C_KEY, c.toString(), c);
return operations.exec();
}
});
Spring Data Redis cũng hỗ trợ @Transactional điều này sẽ tự động liên kết / hủy liên kết kết nối cho bạn, nhưng yêu cầu bạn triển khai phương thức trong bean có thể bị chặn (tức là nó không thể là final
) và các giao dịch sẽ chỉ được bắt đầu nếu được thực thi từ bên ngoài bean (tức là không phải từ một phương thức khác trong cùng một lớp hoặc một lớp con / lớp cha).
Bạn đã bật hỗ trợ giao dịch trên mẫu với redisTemplate.setEnableTransactionSupport(true);
vì vậy bạn nên đi:
@Transactional
public void put(A a, B b, C c) {
aMap.put(A_KEY, a.toString(), a);
bMap.put(B_KEY, b.toString(), b);
cMap.put(C_KEY, c.toString(), c);
}