mariadb 将MySQL默认事务模式设置为READ ONLY和READ UNCOMMITTED,并仅在需要时覆盖,这是否有利?

mbzjlibv  于 2022-11-08  发布在  Mysql
关注(0)|答案(1)|浏览(427)

下面的策略看起来很有效,但是我是否忽略了什么?为什么不总是对读密集型系统这样做呢?对于大多数查询来说,读密集型系统不需要数据一致性。比如博客/出版系统。在我看来

  • 将database-default设置为只读模式。这将捕获编程错误,并可能提供更好的读取性能
-- MySQL / MariaDB schema creation example
-- in a read intensive system, default to read only for security and speed
SET GLOBAL TRANSACTION READ ONLY;
  • 将database-default设置为最不严格的事务隔离级别。这将防止锁定并可能提高读取性能
-- MySQL / MariaDB schema creation example
-- if data integrity is not critical for most queries, choose maximum performance
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
  • 仅对确实需要写访问权限和/或更高事务隔离级别的查询进行重写。在读密集型系统中,写语句周围的这些额外的查询语句不会引起注意
-- MySQL / MariaDB example
...
SET SESSION TRANSACTION READ WRITE;
UPDATE table_x SET field_y=10;
SET SESSION TRANSACTION READ ONLY;
...
aydmsdu9

aydmsdu91#

我从来没有听说过READ UNCOMMITTED是正确的做法的情况。很明显,从其他尚未提交的事务中读取更改(可能会被回滚)可能会导致大量的幻像读取和其他逻辑问题。
我倾向于将默认事务隔离级别设置为READ COMMITTED,尽管这也取决于应用程序的需要。一些应用程序要求默认使用REPEATABLE READ语义。我们不能说这两种方法中的哪一种“更好”,因为这取决于应用程序的需要。
我不知道将事务访问模式设置为READ ONLY有什么性能优势。它可以防止事务更改任何数据,但在我看来,如果您有代码错误,以至于您 * 不知道 * 给定的事务是否会更改数据,那么您将面临更大的问题。
InnoDB有一个只读模式,它影响整个示例,而不是单个事务。https://dev.mysql.com/doc/refman/8.0/en/innodb-read-only-instance.html我怀疑这对于普通的应用程序来说是否能带来显著的性能优势。它必须是一个流量非常高的应用程序,所以你会有一些瓶颈,这是由一些在InnoDB只读模式下被禁用的后台线程引起的。但是在这种类型的应用程序中,你自然需要读写模式。

相关问题