什么是事务?如何执行一个事务?

什么是事务,为什么要使用事务?
事务是指将一系列数据操作捆绑成为一个整体进行统一管理,如果某一事务执行成功,则在该事物中进行的所有数据更改均会提交,成为数据库中的永久组成部分,
如果事务执行时遇到错误且必须取消或回滚,则数据将全部恢复到操作前的状态,所有数据的更改均被清除。

简单的说:
事务是作为单个逻辑工作单元执行的一系列操作
事务是一个不可分割的工作逻辑单元
多个操作作为一个整体向系统提交,要么都执行,要么都不执行

那为啥要用事务呢?
举个栗子:在银行的日常业务中,只要是同一家银行一般账户之间都是支持互相转账的。假如A账户有1000元B账户0元,现在A账户直接转账1000元到B账户,正常的情况下使用SQL语句是先updateA账户的金额减少1000元,再使用SQL语句updateB账户增加1000元,这是没有问题的,但是在生活中我们不会一直都是一帆风顺的,有时候也会出现一些小意外,比如上面的转账的事务需要两个SQL语句才能完成,当你执行了第一条SQL的时候成功了,再执行第二条SQL的时候银行断电了,那你的数据造成的结果就是A账户少了1000块钱,B账户还是0元的大问题!!!所有我们现在就需要使用事务来解决这个问题!把这两个SQL语句当成一个整体来完成!

事务是作为单个逻辑工作单元执行的一系列操作,一个逻辑工作单元必须有四个属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)以及持久性(Durability)这些通常简称为ACID;
1.原子性(Atomicity)
事务是一个完整的操作,事务的各元素是不可分开的(原子性)。事务中的所有元素必须作为一个整体提交或回滚,如果事务中的任何元素失败,则整个事务将失败。
按照上的案列,可以把操作的两个SQL语句看成是一个整体的事务,若是只执行了一条SQL语句,那么整个事务将失败执行回滚,也就是操作会还原到最开始的情况。
2.一致性(Consistency)
当事务完成时,数据必须处于一致状态。在事务开始之前,数据库中存储的数据处于一致状态,在正在进行的事务中,数据可能处于不一致的状态,如数据可能有部分被修改,然而当事务完成的时候,数据必须再次回到已知的一致状态。
按照上的案列来说,你一开始的时候A账户1000元和B账户0元,那么加起来就是1000元,在你执行完SQL语句之后两个账户加起来还是1000元稳定的状态,不能出现损坏了数据的情况
比如出现A账户0元和B账户也是0元的情况。事务完成之后,账户的余额的总额再次恢复到一致的状态。
3.隔离性(Islation)
并发事务之间彼此隔离、独立,它不应以任何方式依赖于或影响其他事务。
对数据进行修改的所有并发事务是彼此隔离的、这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务,修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。无论你怎么修改,若是该事物没有成功提交之后都是不生效的,数据的修改一直到你成功提交事务才会生效,A账户和B账户之间的转账,永远是相对独立的。
4.持久性(durability)
事务完成后,它对数据库的修改被永远保持。
简单的说就是一个事物完成之后,它对于数据库的改变是永久性的,即使系统出现故障也是如此,也就是说,一旦提交了事务,事务的效果将会永远地保存在数据库中。

如何执行事务?
随便提一下支持事物的存储引擎有InnoDB和BDB,MyISAm引擎不支持事务的。
默认的情况下每条SQL语句就是一个事务的,即执行SQL语句后自动提交,为了达到将几个操作作为一个整体的目的,需要先关闭自动提交模式,选择手动提交或回滚事务:
语法如下:

SET autocommit=01;

0表示关闭自动提交。
1表示开启自动提交。
我们现在是关闭所有只需要执行SET autocommit=0;就可以了
接着我们就可以开启一个事务了

BEGIN;或者START TRANSACTION; # 开启一个事物

这个语句是提交的起点,
提交事务的语法:

COMMIT;

这个语法标志一个事务成功提交,自事务开始至提交语句之间执行的所有数据更新将永久地保存在数据库中,并释放连接时占用的资源。
还有回滚撤销事务的语法:

ROLLBACK;

用于清除自事务起点至该语句所做的所有数据的更新操作,将数据库状态回滚到事务开始前,并释放由事务控制的资源。

ROLLBACK的例子执行了SQL语句之后回滚到一开始的状态如下:
在这里插入图片描述
提交事务的案列:
在这里插入图片描述
从begin开始事务,到执行commit提交事务,数据会写入硬盘,永久地保存下来。

这是我对事务的一些总结的看法,如果觉得还行,麻烦路过的小哥哥或小姐姐点个赞…,感谢你的支持我会更加努力把博客写得更好!!!

发布了152 篇原创文章 · 获赞 141 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_44739706/article/details/105177539