我正在研究数据库中潜在的并发问题,所以我去阅读了。我发现 http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/c0005267.htm 它还提到了对未提交数据的访问。

访问未提交的数据。应用程序A可能会在数据库中更新一个值,并且应用B可能在提交该值之前读取该值。然后,如果A的值以后未提交,而是备份,则B执行的计算基于不合格(可能是无效的)数据。

什么...我认为其他会话(相同的应用程序,甚至相同的线程)可以读取尚未提交的数据?我认为只有将数据写入未提交事务的连接/会话(我不确定我的术语)可以读取未提交的数据。

其他线程真的可以读取尚未提交的数据吗?我打算使用 mysql 但我可能会使用 sqlite

有帮助吗?

解决方案

其他会话可以读取的内容取决于您如何设置数据库。在 MySQL 中,这还取决于您使用的数据库引擎。您要查找的术语(以 ANSI SQL 术语表示)是 “隔离级别”.

许多数据库将默认设置一个隔离级别,其中未提交数据的读取将被阻止。因此,如果事务 A 更新表 T 中的记录 1234,然后事务 B 尝试在 A 提交或回滚之前选择记录 1234,则 B 将阻塞,直到 A 执行其中一项操作。

MySQL 事务,第二部分 - 事务隔离级别.

这样做的一个严重缺点是,长时间运行的事务中的批量更新操作(通常)可能会阻止许多请求。

您还可以设置它,以便 B 看到未提交的数据,但这通常是不明智的。

或者,您可以使用名为的方案 MVCC (“多版本并发控制”),这将根据事务开始的时间为不同的事务提供一致的数据视图。这避免了未提交的读取问题(读取可能回滚的数据)并且更具可扩展性,特别是在长期事务的上下文中。

MySQL 支持 MVCC.

其他提示

当然,在SQL服务器,你可以,你要选择做它,它不是默认的,但如果你使用了正确的隔离级别或查询提示,你可以选择读未提交的行,这可导致问题和在理论上同一行的甚至一个双读取。

该文章提到访问未提交的数据是问题之一 消除了 由数据库管理器。

数据库管理器控制此访问以防止不良效果,例如:

...

  • 访问未提交的数据。

MySQL 的 InnoDB 存储引擎支持多种事务隔离级别。详细信息请参见http://dev.mysql.com/doc/refman/5.4/en/set-transaction.html.

有关某些数据库的一些版本中,设置查询是因为降低的锁定能够读未提交将提高性能。这仍然留下安全性,可靠性和可扩展性的问题需要回答。

要给出一个具体的,我曾经在一个非常大的电子商务网站合作。他们用读取未提交上读取到商店目录,因为数据被频繁访问,不经常改变,关于阅读未提交的数据的担忧不敏感。从目录中用于下订单的任何数据将反正重新验证。这是SQL Server 2000中,这是众所周知的有锁的性能问题上。 SQL Server的新版本,锁定性能有所提升,所以这不会是必要的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top