事务

来源:互联网 发布:python的shell运行 编辑:程序博客网 时间:2024/05/29 09:33

事务就是由若干条写语句组成的执行单元,单元的全部写语句要么全执行、要么都不执行。

在MySQL环境中,事务是由一个或多个SQL语句组成的独立的单元。这个单元中的每个SQL语句是互相依赖的,而且单元作为一个整体是不可分割的。
如果单元中的一个语句不能完成,整个单元就会回滚(撤销),所有影响到的数据将返回到事务开始以前的状态。
因而,只有事务中的所有语句都成功地执行才能说这个事务被成功地执行

事务只针对insert、update、delete语句生效(除了select语句)

如何使用事务

开启事务
start transaction;
提交(结束)事务
把事务中全部的写语句持久化到数据库
commit;
撤消(回滚)事务
把数据库的信息状态还原到事务开始之前
rollback;

start transaction作用:
防止写sql语句立即持久化到数据库(防止commit自动提交),会形成事务日志文件(写事务日志、撤销事务日志)系统里边有一个会话变量,可以防止自动commit提交
set autocommit=0; //禁止自动提交写sql语句到数据库
set autocommit=1; //开启自动提交

set autocommit=0 不完全等同于 start transaction,
set autocommit=0 设置完毕后,在当前的连接中始终禁止自动提交,后边可以执行多个commit或rollback
start transaction 就是临时禁止自动提交,当执行一个commit或rollback后,其就失去作用

提交动作:set autocommit=0 commit/set autocommit=1
回滚动作: set autocommit=0 rollback

部分撤销

根据业务要求,进行事务的部分撤销实现:

说明:在以上语句中,第一行语句开始了一个事务;第2、3行语句对数据进行了修改,但没有提交;第4行设置了一个保存点;第5行删除了数据,但没有提交;第6行将事务回滚到保存点S1,这时第5行所做修改被撤销了;第7行修改了数据;第8行结束了这个事务,这时第2、3、7行对数据库做的修改被持久化。

四个特性

事务4个特性:
术语“ACID”是一个简称,每个事务的处理必须满足ACID原则,
即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)

原子性

原子性意味着每个事务都必须被认为是一个不可分割的单元。原子的执行是一个或者全部发生或者什么也没有发生的命题

一致性

体现的是业务数据的一致性,从A账户扣除100元钱,则B账户必定需要增加100元钱。否则大家不增不少

隔离性

隔离性是指每个事务在它自己的空间发生,和其他发生在系统中的事务隔离,而且事务的结果只有在它完全被执行时才能看到

持久性

通过事务实现对数据库的操作最终会被永久记录在数据库mysql服务器里边,实现的机制是通过二进制日志文件

注意

  1. 在当前的连接中,没有commit提交的情况下,是可以看到变化后的数据的,但是其他连接看不到,只有commit之后,其他连接才可以看到变化后的数据
  2. 当执行rollback操作后,数据都还原到事务开始之前的状态
  3. 一组start transaction/commit[rollback]执行完毕后,再次执行的写语句(没有开启事务),立即执行立即持久化,没有反悔的余地
  4. set autocommit=0; 开启事务(禁止自动commit提交),并且可以多次使用commit/rollback,进行分批次的提交/回滚动作
    set autocommit=1; 关闭事务(开启自动commit提交)
    自动commit提交:每个写语句都立即持久化到数据库中
  5. 与事务有关的数据表的存储引擎要求是innodb的,innodb支持事务

MySQL使用的是平面事务模型,因此嵌套的事务是不允许的。
在第一个事务里使用START TRANSACTION命令后,当第二个事务开始时,自动地提交第一个事务。同样,下面的这些MySQL语句运行时都会隐式地执行一个COMMIT命令:
● DROP DATABASE / DROP TABLE
● CREATE INDEX / DROP INDEX
● ALTER TABLE / RENAME TABLE
● LOCK TABLES / UNLOCK TABLES

0 0
原创粉丝点击