SELECT ... FOR UPDATE 加锁后,其他线程能读取数据吗

在数据库中使用 SELECT ... FOR UPDATE 时,会对选中的行加上排他锁(X锁),阻止其他事务对这些行进行修改或删除。但其他事务是否能够读取这些数据,取决于数据库的隔离级别:

  1. READ UNCOMMITTED(读未提交)

    • 其他事务可以读取被锁定的行,即使这些行尚未提交。
  2. READ COMMITTED(读已提交)

    • 其他事务只能读取已提交的数据,不能读取未提交的修改。
  3. REPEATABLE READ(可重复读)

    • 其他事务只能读取已提交的数据,不能读取未提交的修改。
  4. SERIALIZABLE(串行化)

    • 其他事务只能读取已提交的数据,且可能因严格的隔离级别而无法读取被锁定的行。

总结

  • 读取未提交数据 :仅在 READ UNCOMMITTED 级别下允许。

  • 读取已提交数据 :在 READ COMMITTEDREPEATABLE READSERIALIZABLE 级别下允许,但 SERIALIZABLE 可能限制更多。

因此,SELECT ... FOR UPDATE 加锁后,其他事务能否读取数据取决于数据库的隔离级别。

相关推荐
noravinsc27 分钟前
django admin AttributeError: ‘UserResorce‘ object has no attribute ‘ID‘
数据库·django·sqlite
王有品3 小时前
Spring MVC 多个拦截器的执行顺序
数据库·spring·mvc
极小狐3 小时前
如何使用极狐GitLab 的外部状态检查功能?
数据库·ci/cd·gitlab·devops·mcp
Leo.yuan4 小时前
数据仓库建设全解析!
大数据·数据库·数据仓库·数据分析·spark
闪电麦坤954 小时前
SQL:子查询(subqueries)
数据库·sql
活跃的煤矿打工人4 小时前
【星海出品】分布式存储数据库etcd
数据库·分布式·etcd
文牧之4 小时前
PostgreSQL的扩展 pgcrypto
运维·数据库·postgresql
老友@6 小时前
小集合 VS 大集合:MySQL 去重计数性能优化
数据库·mysql·性能优化
声声codeGrandMaster6 小时前
django之优化分页功能(利用参数共存及封装来实现)
数据库·后端·python·django
麦麦大数据7 小时前
vue+neo4j+flask 音乐知识图谱推荐系统
vue.js·mysql·flask·知识图谱·neo4j·推荐算法·音乐推荐