是否仅通过事务对数据库进行更改?

时间:2019-07-23 20:57:35

标签: mysql sql database transactions rdbms

关于事务在数据库中的作用,我无法完全清楚地理解。

我知道包含在事务中的操作将一起执行,然后提交或回滚。

但是我在不手动创建事务的情况下写入数据库的其他任何查询又如何呢? 是为他们内部创建的交易吗?

那select语句呢?是否也为他们创建了交易?

我已经使用数据库和sql已有一段时间了,可惜我不清楚这些

2 个答案:

答案 0 :(得分:1)

SQL事务是包含数据操作语言(DML)的任何语句。也就是说,任何更改表中值的语句,例如UPDATE,INSERT,MERGE,DELETE等。

答案 1 :(得分:1)

仅通过事务进行DB更改吗?简短的回答是。

总是涉及一笔交易:

  • 如果您依赖数据库会话的AUTOCOMMIT行为,它可能会在您发出的每个DML语句中自动开始(之前)和提交(之后)
  • 或者您可以明确地从BEGIN开始,执行语句并以COMMIT结尾

我喜欢将事务视为边界,它对其中包含的语句施加了ATOMICITY和ISOLATION清晰的语义。

您描述的是原子性(全部或全部行为),但这并不是事务可以给您的唯一保证:还有隔离(这与事务中的读取内容有关(例如SELECTs)。

在并发应用程序中(许多客户端同时写入和读取相同的db /表),事务ISOLATION是定义“可以在当前操作中观察到的其他操作影响多少”的属性。例如,假设您需要执行一个涉及多次执行同一SELECT的事务:是否希望该SELECT每次(可能由于并发进行某些修改)返回(可能)不同的结果?

对于单个语句为:

  • 单个DML(UPDATE,INSERT ...)语句本身实际上就是“就像在带有单个语句的事务中一样,它在执行后立即被提交”(之所以这样,是因为您在AUTOCOMMIT中,或者您在BEGIN ... COMMIT中包装了一条语句)

  • 对于单个SELECT来说是相同的。在这种情况下(隐式或非隐式),您可以指定不同的隔离级别。为SELECTS考虑事务可能听起来很奇怪,但是要求特定的隔离级别可能意味着db正在后台获取对数据的锁定:在这种情况下提交事务将释放这种锁定。

由于您标记了mysql,因此您可以在这里阅读mysql支持的事务隔离: https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html