I have a table like below:
SELECT id, name FROM node;
+----+------+
| id | name |
+----+------+
| 5 | na |
+----+------+
Then define below function:
>>> def foo_with_sfu(seconds):
... with transaction.atomic():
... node = Node.objects.select_for_update().filter(pk=5)
... time.sleep(seconds)
... node = Node.objects.get(pk=5)
... print(node.name)
...
I was hoping the select_for_update will lock row pk=5 so if I open another console to change the node.name during time.sleep, the change operation will be blocked.
But actually when I run the function, and run update sql in another console during the time.sleep, the update were not blocked.
It seems the select for update not locking up the row. Why?