我开始使用MySQL trnsactions,我有一个疑问:
在文档中说:
开始交易会导致任何待处理的交易 承诺。请参见第13.3.3节“导致隐含的语句” 提交“,了解更多信息。
我在同一个Web应用程序上有或多或少的5个用户(它是一个本地测试应用程序),所有这些用户共享同一个MySQL用户与数据库进行交互。
我的问题是:如果我在代码中使用事务并且其中两个启动事务(因为插入,更新或其他东西),那么事务是否会相互干扰?
我在导致隐式提交的语句中看到包括启动事务。作为本地应用程序快速而难以判断是否存在错误,每个查询都按预期结束,但我仍有疑问。
答案 0 :(得分:1)
默认情况下,使用MySQl,每个连接都已启用autocommit
。也就是说,每个连接将立即提交每个查询。因此,对于InnoDb表,每个事务都是原子的 - 它完全完成且没有干扰。
对于需要多个操作的更新,您可以使用START TRANSACTION
查询来使用事务。任何未完成的交易都将被提交,但这不会成为问题,因为大多数情况下它们都会被提交。
在收到COMMIT
查询之前执行的所有更新都保证完全无干扰地完成,或者在ROLLBACK
的情况下,不应用任何更新。
来自其他连接的其他转换会在此过程中看到数据库的一致视图。
此属性符合ACID(原子性,一致性,隔离性,耐久性)您应该可以使用InnoDB表。
其他表类型可能会实现不同级别的ACID合规性。如果您需要使用它,请仔细检查。
答案 1 :(得分:1)
隐式提交在会话中发生。
因此,例如,您启动一个事务,执行一些更新,然后忘记关闭事务并启动一个新事务。然后第一笔交易将隐含承诺。
但是,与数据库的其他连接不会受到影响;他们有自己的交易。
你说5个用户使用相同的db用户。好的,可以。但是为了让它们执行单独的操作,它们不应该使用相同的连接/会话。