关于事务

274 阅读2分钟

事务,是SQL中的一组逻辑操作单元,可以使数据从一种状态变为另一种状态,在此基础上,它还有各种细节需要注意。

事务的ACID特性

原子性(atomicity):

该特性保证了事务的处理结果只有两种形态,即成功失败,不存在介于成功与失败之间的其他情况。

一致性(consistency):

该特性保证了事务处理时,两种状态下数据的一致性,例:转账100元,付款方需扣除100元,收款方需增加100元,不能是付款方扣除100,收款方增加50。两边数据必须相对应。

隔离性(isolation)

该特性保证了事务在处理的过程中,不会有其他的事务对数据进行使用,例:事务A打算将50通过+50修改为100,但是在将100存入硬盘时事务B读取了还未被修改的50进行操作,通过+100将其改为了150并存入硬盘,而此时事务A将修改的100存入了硬盘,这就导致结果数据发生错误,可见隔离性对于事务是特别重要的。

持久性(durability)

该特性保证了事务提交后对数据库修改的不可逆性,特别的,该特性由事务日志支持。指数据库一旦被已经提交的事务修改,则其他操作或数据库故障不应该对其产生的效果进行更改

事务日志:包括重做日志与回滚日志,当我们通过事务对数据进行修改的时候,首先会将数据库的变化信息记录到重做日志中,然后再对数据库进行修改。这样做的好处是可以在发生错误后找到未被修改的重做日志,重新执行,以规避该错误。

事务的其他要点

  • 开始事务应使用begin 或者 start transaction(后面可接read only/read write/with consistent snapshot)

  • 结束事务应使用commit进行提交或rollback进行回滚。

  • 使用了指令开始事务的情况下,即使autocommit=true,DML语句不会在执行完语句后就自动提交数据,而是会等待事务结束时的commit,但是DDL语句执行完后会自动提交数据。

  • 没有使用指令开启事务时,任何DML语句都可以看作一个完整的事务(隐性)。