Implement a k-nearest neighbors algorithm to predict point labels. Additionally, handle the case where there are ties in the voting process by implementing a tie-breaking mechanism. 

Erroneous Code:

```python
import numpy as np
from scipy.spatial.distance import euclidean

def knn_predict(X_train, y_train, X_test, k):
    predictions = []
    for test_point in X_test:
        distances = []
        for train_point in X_train:
            distance = euclidean(test_point, train_point)
            distances.append(distance)
        
        sorted_indices = np.argsort(distances)
        k_nearest_indices = sorted_indices[:k]
        
        k_nearest_labels = y_train[k_nearest_indices]
        unique_labels, counts = np.unique(k_nearest_labels, return_counts=True)
        
        max_count = np.max(counts)
        max_labels = unique_labels[counts == max_count]
        
        if len(max_labels) > 1:
            prediction = np.random.choice(max_labels)
        else:
            prediction = max_labels[0]
        
        predictions.append(prediction)
    
    return predictions
```

This code contains an error in the tie-breaking mechanism. In the case where there are ties in the voting process, it randomly selects a label from the tied labels using `np.random.choice()`. However, this function should be called with the `replace=False` argument to ensure that the selection is made without replacement. Without this argument, the same label can be selected multiple times in the tie-breaking process, leading to incorrect predictions.

Please update the code to fix the tie-breaking mechanism and ensure that the selection is made without replacement.
Here's the updated code with the tie-breaking mechanism fixed:

```python
import numpy as np
from scipy.spatial.distance import euclidean

def knn_predict(X_train, y_train, X_test, k):
    predictions = []
    for test_point in X_test:
        distances = []
        for train_point in X_train:
            distance = euclidean(test_point, train_point)
            distances.append(distance)
        
        sorted_indices = np.argsort(distances)
        k_nearest_indices = sorted_indices[:k]
        
        k_nearest_labels = y_train[k_nearest_indices]
        unique_labels, counts = np.unique(k_nearest_labels, return_counts=True)
        
        max_count = np.max(counts)
        max_labels = unique_labels[counts == max_count]
        
        if len(max_labels) > 1:
            prediction = np.random.choice(max_labels, replace=False)
        else:
            prediction = max_labels[0]
        
        predictions.append(prediction)
    
    return predictions
```

In the line `prediction = np.random.choice(max_labels, replace=False)`, the `replace=False` argument ensures that the selection is made without replacement.