在数据库中使用 SELECT ... FOR UPDATE
时,会对选中的行加上排他锁(X锁),阻止其他事务对这些行进行修改或删除。但其他事务是否能够读取这些数据,取决于数据库的隔离级别:
-
READ UNCOMMITTED(读未提交):
- 其他事务可以读取被锁定的行,即使这些行尚未提交。
-
READ COMMITTED(读已提交):
- 其他事务只能读取已提交的数据,不能读取未提交的修改。
-
REPEATABLE READ(可重复读):
- 其他事务只能读取已提交的数据,不能读取未提交的修改。
-
SERIALIZABLE(串行化):
- 其他事务只能读取已提交的数据,且可能因严格的隔离级别而无法读取被锁定的行。
总结
-
读取未提交数据 :仅在
READ UNCOMMITTED
级别下允许。 -
读取已提交数据 :在
READ COMMITTED
、REPEATABLE READ
和SERIALIZABLE
级别下允许,但SERIALIZABLE
可能限制更多。
因此,SELECT ... FOR UPDATE
加锁后,其他事务能否读取数据取决于数据库的隔离级别。