什么是事务

在mysql事务就是最小不可分割的工作单元,事务能够保证业务的完整性。要么都执行,要么都不执行,不允许执行一部分。

为什么需要事务呢?

假设一个场景:A给B转账100,此时A-100,B+100,如果现在只发生A-100的操作,没有发生B+100,则会出数据前后不一致性。

在数据库中,我们操作多条sql语句,使用事务时会产生同时失败,或者同时成功,这样结果使得产生的数据一致性。

mysql如何控制事务

mysql默认开启事务。使得我们我们在执行一个sql语句时,效果立马体现出来,产生的数据不能回滚(不能撤销操作)。

select @@autocommit;用于查看默认事务的提交状态,为1则是默认提交,为0则需要手动提交。

mysql默认的事务传播特性 数据库默认事务_mysql默认的事务传播特性


我们创建一个uers表。

mysql默认的事务传播特性 数据库默认事务_回滚_02


我们往该表中插入元素。

mysql默认的事务传播特性 数据库默认事务_数据_03


但是有时候我们希望语句执行后,能够撤销到上一层,这是我们使用rollback回滚语句。

mysql默认的事务传播特性 数据库默认事务_数据_04


但是我们发现现在使用rollback并不能回滚数据,这是由于sql事务是默认提交的,但提交了就不能回滚,如果我们还需要回滚,则需要先将默认提交给关闭。

这时我们需要set outcommit = 0关闭mysql自动提交。

mysql默认的事务传播特性 数据库默认事务_数据_05


实例:

mysql默认的事务传播特性 数据库默认事务_数据库_06

因为上面我们将默认提交给关闭了,所以现在我们使用回滚语句。

mysql默认的事务传播特性 数据库默认事务_数据库_07


当使用回滚语句后,我们发现刚插入的数据撤销了,底层到底是怎么实现的呢?

mysql默认的事务传播特性 数据库默认事务_数据_08

我们将事务的默认提交方式给关闭了,实际上insert是将数据插入到一个拷贝出来的虚表中,在数据库中实际上是不存在的,因此我们使用rollback回滚的其实是一个虚表。

当我们把默认提交关闭后,还需要将数据写入到数据库中,这是我们需要将数据进行手动提交,在insert语句后面,加上commit,手动提交的方法。

mysql默认的事务传播特性 数据库默认事务_mysql默认的事务传播特性_09


在实际情况中,数据库事务是默认提交的,因此是不能回滚的,但是我们如果想要进行回滚,则需要在执行sql语句前执行begin或者start transaction。

mysql默认的事务传播特性 数据库默认事务_数据_10


mysql默认的事务传播特性 数据库默认事务_数据库_11


默认关闭提交,我们需要使用begin,start transaction语句。

mysql默认的事务传播特性 数据库默认事务_mysql默认的事务传播特性_12


因此,begin与start transaction语句作用时间只能回滚一次,多次回滚需要执行多次begin与start transaction语句。

如果,使用begin语句想要写入到数据库中,则需要在最后使用commit写入数据库中。

mysql默认的事务传播特性 数据库默认事务_回滚_13