事务
事务安全
事务概念
事务(transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元。事务通常由高级数据库操作语言或编程语言书写的用户程序的执行所引起。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
事务基本原理
基本原理:MySQL
允许将事务统一进行管理(存储引擎innodb
),将用户所做的操作,暂时保存起来,不直接放到数据表(更新),等到用于确认结果之后再进行操作。
事务在MySQL
中通常是自动提交的,但是也可以使用手动事务。
自动事务
自动事务:autocommit
,当客户端发送一条SQL
指令(写操作:增删改)给服务器的时候,服务器在执行之后,不用等待用户反馈结果,会自动将结果同步到数据表。
证明:利用两个客户端,一个客户端执行SQL
指令,另外一个客户端查看执行结果。
自动事务:系统做了额外的步骤来帮助用户操作,系统通过变量autocommit
来控制的。
show variables like 'autocommit%';
关闭自动事务,关闭之后系统就不在帮助用户提交结果了。
set autocommit=off;
一旦自动事务关闭,那么需要用户提供是否同步的命令。
commit
:提交(同步到数据表,事务也会被清空)rollback
:回滚(清空之前的操作,不要了)
事务没有提交的对比查看:在执行事务端的客户端中,系统在进行数据查看的时候会利用事务日志中保存的结果对数据进行加工。
通常,我们不会关闭自动事务,:这样操作太麻烦,还给服务器一定压力。因此只会在需要使用事务的时候才会进行操作(手动事务)。
手动事务
手动事务:不管是开始还是过程还是结束都需要程序员,手动的发送事务操作指令来实现。
手动事务对应的命令:
start transaction
//开启事务:从这条语句开始,后面所有语句都不会直接写入到数据表中,而是保存到事务日志中- 事务处理:多个写指令构成
- 提交事务:
commit
/rollback
,到这个时候所有的事务才算结束
开启事务
执行事务
将多个连续的但是是一个整体的SQL
指令,逐一执行
提交事务
确认提交:commit
,数据写到数据表(清空事务日志)
回滚操作:rollback
,所有数据无效(清空事务日志)
回滚点
回滚点:savepoint
,当有一系列事务操作时,而其中的步骤如果成功了,没有必要重新来过,可以在某给点(成功),设置一个记号(回滚点),然后如果后面有失败,那么可以回到这个记号位置。
增加回滚点:savepoint 回滚点名字;
回到回滚点:rollback to 回滚点名字;
注意:在一个事务处理中,如果有很多个步骤,那么可以设置多个回滚点。但是如果回到了前面的回滚点,后面的回滚点就失效。
事务特点
事务应该具有四个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID
特性。
- 原子性(
atomicity
):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。 - 一致性(
consistency
):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 - 隔离性(
isolation
):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。 - 持久性(
durability
):持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。