#### 15.20.6.4 控制 InnoDB memcached 插件的事务行为

不同于传统**内存缓存**， 这`daemon_memcached`插件允许您控制通过调用生成的数据值的持久性`添加`,`放`,`增量`， 等等。默认情况下，通过**内存缓存**接口存储到磁盘，并调用`得到`从磁盘返回最新的值。尽管默认行为不能提供最佳的原始性能，但与 SQL 接口相比它仍然很快`InnoDB`表。

随着您获得使用`daemon_memcached`插件，您可以考虑放宽非关键数据类的持久性设置，如果发生中断，可能会丢失一些更新的值，或者返回稍微过时的数据。

##### 提交频率

持久性和原始性能之间的一种权衡是新数据和更改数据的频率[坚定的](glossary.html#glos_commit).如果数据很关键，则应立即提交，以便在意外退出或中断时安全。如果数据不太重要，例如意外退出后重置的计数器或您可以承受丢失的日志数据，您可能更喜欢更高的原始吞吐量，但提交频率较低。

当一个**内存缓存**操作插入、更新或删除底层数据`InnoDB`表，更改可能会提交给`InnoDB`立即表（如果[`daemon_memcached_w_batch_size=1`](innodb-parameters.html#sysvar_daemon_memcached_w_batch_size)）或一段时间后（如果[`daemon_memcached_w_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_w_batch_size)值大于 1)。在任何一种情况下，都无法回滚更改。如果你增加[`daemon_memcached_w_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_w_batch_size)为了避免繁忙时间的高 I/O 开销，当工作负载减少时，提交可能会变得不频繁。作为一种安全措施，后台线程自动提交通过**内存缓存**定期 API。间隔由[`innodb_api_bk_commit_interval`](innodb-parameters.html#sysvar_innodb_api_bk_commit_interval)配置选项，默认设置为`5`秒。

当一个**内存缓存**操作在底层中插入或更新数据`InnoDB`表，更改的数据立即对其他人可见**内存缓存**请求，因为新值保留在内存缓存中，即使它尚未在 MySQL 端提交。

##### 事务隔离

当一个**内存缓存**操作如`得到`要么`增量`导致对底层的查询或 DML 操作`InnoDB`表，您可以控制操作是否看到写入表的最新数据、仅已提交的数据或其他事务变体[隔离级别](glossary.html#glos_isolation_level).使用[`innodb_api_trx_level`](innodb-parameters.html#sysvar_innodb_api_trx_level)配置选项来控制此功能。为此选项指定的数值对应于隔离级别，例如[`可重复阅读`](innodb-transaction-isolation-levels.html#isolevel_repeatable-read).见说明[`innodb_api_trx_level`](innodb-parameters.html#sysvar_innodb_api_trx_level)有关其他设置的信息的选项。

严格的隔离级别可确保您检索的数据不会回滚或突然更改，从而导致后续查询返回不同的值。然而，严格的隔离级别需要更大的[锁定](glossary.html#glos_locking)开销，这可能导致等待。对于不使用长时间运行事务的 NoSQL 样式应用程序，您通常可以使用默认隔离级别或切换到不太严格的隔离级别。

##### 为 memcached DML 操作禁用行锁

这[`innodb_api_disable_rowlock`](innodb-parameters.html#sysvar_innodb_api_disable_rowlock)选项可用于禁用行锁时**内存缓存**通过请求`daemon_memcached`插件导致 DML 操作。默认，`innodb_api_disable_rowlock`被设定为`离开`意思就是**内存缓存**请求行锁`得到`和`放`操作。什么时候`innodb_api_disable_rowlock`被设定为`在`,**内存缓存**请求表锁而不是行锁。

这`innodb_api_disable_rowlock`选项不是动态的。它必须在启动时指定[**mysqld**](mysqld.html)命令行或在 MySQL 配置文件中输入。

##### 允许或禁止 DDL

默认情况下，您可以执行[DDL](glossary.html#glos_ddl)之类的操作[`更改表`](alter-table.html)在使用的表上`daemon_memcached`插入。为避免在将这些表用于高吞吐量应用程序时出现潜在的减速，请通过启用禁用对这些表的 DDL 操作[`innodb_api_enable_mdl`](innodb-parameters.html#sysvar_innodb_api_enable_mdl)在启动时。当通过两者访问相同的表时，此选项不太合适**内存缓存**和 SQL，因为它阻塞[`创建索引`](create-index.html)表上的语句，这对于运行报告查询可能很重要。

##### 将数据存储在磁盘、内存或两者中

这`innodb_memcache.cache_policies`table 指定是否存储通过表写入的数据**内存缓存**磁盘接口（`innodb_only`，默认值）；仅在记忆中，与传统**内存缓存**(`仅缓存`);或两者 （`缓存`）。

随着`缓存`设置，如果**内存缓存**在内存中找不到键，它在`InnoDB`桌子。从返回的值`得到`根据调用`缓存`如果值在磁盘上更新，则设置可能已过期`InnoDB`表，但尚未从内存缓存中过期。

缓存策略可以独立设置`得到`,`放`（包含`增量`和`decr`),`删除`， 和`冲洗`操作。

例如，您可能允许`得到`和`放`查询或更新表的操作和**内存缓存**同时内存缓存（使用`缓存`设置），同时制作`删除`,`冲洗`，或两者都只对内存中的副本进行操作（使用`仅缓存`环境）。这样，删除或刷新项目只会使缓存中的项目过期，并且从缓存中返回最新值`InnoDB`下次请求该项目时表。

```
mysql> SELECT * FROM innodb_memcache.cache_policies;
+--------------+-------------+-------------+---------------+--------------+
| policy_name  | get_policy  | set_policy  | delete_policy | flush_policy |
+--------------+-------------+-------------+---------------+--------------+
| cache_policy | innodb_only | innodb_only | innodb_only   | innodb_only  |
+--------------+-------------+-------------+---------------+--------------+

mysql> UPDATE innodb_memcache.cache_policies SET set_policy = 'caching'
       WHERE policy_name = 'cache_policy';
```

`innodb_memcache.cache_policies`值仅在启动时读取。更改此表中的值后，卸载并重新安装`daemon_memcached`插件以确保更改生效。

```
mysql> UNINSTALL PLUGIN daemon_memcached;

mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
```
