一场向底部的竞赛

主要观点:数据库是现代应用的关键部分,其并发控制易被开发者忽视,文中以常见代码模式为例讲解数据库事务及隔离级别,揭示并发事务执行导致的问题及数据竞争和竞争条件,介绍不同隔离级别及其对并发事务的影响,如脏读、不可重复读、幻读等,通过示例代码展示应用中存在的漏洞及在不同环境下的测试结果,提出缓解措施如设置事务隔离级别为可序列化、手动实现悲观锁或乐观锁等,还介绍了检测未指定隔离级别的方法,强调这并非数据库引擎的 bug 而是常见误解,应审查应用的关键业务操作确保进行了适当的数据锁定。
关键信息

  • 展示 Go 语言的数据库事务代码及常见漏洞,如并发请求导致账户透支。
  • 介绍 ANSI SQL-92 标准的四种隔离级别及其特点和默认情况。
  • 说明数据库并发执行的工作原理及锁类型(共享锁和排他锁)。
  • 分析两种易受攻击的代码模式及对数据库状态的影响。
  • 讲述在不同数据库(Postgres、MySQL、MariaDB)和环境下的测试结果及语言并发模式对可利用性的影响。
  • 提出缓解数据竞争的多种方法,如设置隔离级别、手动锁等。
  • 介绍检测未指定隔离级别的 Semgrep 规则。
    重要细节
  • 代码中Transfer函数的具体操作及各步骤的作用。
  • 不同隔离级别下并发事务的具体现象及示例。
  • 数据库日志中事务执行的详细信息及锁相关的查询语句。
  • 各种测试环境的设置及攻击方法的细节。
  • 缓解措施的具体代码实现及注意事项。
  • Semgrep 规则的具体内容及应用场景。
阅读 12
0 条评论