MYSQL的COMMIT和ROLLBACK使用讲解

一. 从功能上划分,SQL 语言可以分为DDL,DML和DCL三大类。

1. DDL(Data Definition Language)   (隐式提交)

数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言 ;

create---创建表

alter---修改表

drop---删除表

2. DML(Data Manipulation Language)  (除select外 都是显示提交,如果设置了autocommit 则都自动提交)

数据操纵语言,SQL中处理数据等操作统称为数据操纵语言 ;

insert---数据的插入

delete---数据的删除

update---数据的修改

select---数据的查询

显式提交的,也就是说要在执行完DML语句之后,执行 COMMIT

3. DCL(Data Control Language)

数据控制语言,用来授予或回收访问数据库的某种特权,并控制 数据库操纵事务发生的时间及效果,对数据库实行监视等;

grant--- 授权。

rollback---回滚。

commit--- 提交。

二. 提交数据有三种类型:显式提交、隐式提交及自动提交。

下面分 别说明这三种类型。

(1) 显式提交

用 commit 命令直接完成的提交为显式提交。

(2) 隐式提交

用 SQL 命令间接完成的提交为隐式提交。这些命令是:create-创建表,alter-修改表,drop-删除表 ,AUDIT , COMMENT , CONNECT , CREATE , DISCONNECT , EXIT , GRANT , NOAUDIT , QUIT , REVOKE , RENAME 。

隐式提交 在运行以上这些语句后,mysql数据库会自动隐式提交,例如 CREATE TABLE,在运行脚本后,表已经建好了,并不在需要你再进行显式提交。

(3) 自动提交

若把 AUTOCOMMIT 设置为 ON ,则在插入、修改、删除语句执行cursor.excute(sql)后,系统将自动进行提交,这就是自动提交。其格式为: SQL>SET AUTOCOMMIT ON ; Ref:https://blog.csdn.net/qq_15559817/article/details/81449746

一般情况下,oracle数据库本身默认不设置自动提交(或设置自动提交为false),mysql数据库本身默认设置自动提交(或设置自动提交为true)。若mysql数据库已设置自动提交,此时,我们在代码里还去主动commit,则会报错Can't call commit when autocommit=true。该问题对rollback有同样的影响(Can't call callback when autocommit=true)。
原文链接:https://blog.csdn.net/songzehao/article/details/79801454

三. commit/roolback 具体执行过程

commit / rollback这两个命令用的时候要小心。 COMMIT / ROLLBACK 都是用在执行 DML语句(INSERT / DELETE / UPDATE / SELECT )之后的。DML 语句,执行完之后,处理的数据,都会放在回滚段中(除了 SELECT 语句),等待用户进行提交(commit)或者回滚 (rollback),当用户执行 commit / rollback后,放在回滚段中的数据就会被删除。

# pymysql 
sql_i="insert  command" or update or delete command
sql_s="select command"
try:
   # 执行SQL语句, 可以理解为将要插入/更新/删除的数据暂时存放在 回滚段(或缓存) 中
   # 如果后面执行 commit 数据库中的数据才会真正被更改;如果后面执行rollback,那么之前的修改都不会在数据库中执行
   cursor.execute(sql_i) 
   cursor.execute(sql_s) #虽然上一句插入操作还没有在数据库中执行,但是也记录在缓存中了,select 不仅会去数据库中查询,还会查询缓存中的数据,所以这里能查到第一条插入的记录,但查不到第二条插入的记录
   cursor.execute(sql_i) # 
   db.commit() # 向数据库提交修改好的数据
except:
   db.rollback()# 发生错误时回滚,缓存中的数据被删除

SELECT 语句执行后,数据都存在共享池。提供给其他人查询相同的数据时,直接在共享池中提取,不用再去数据库中提取,提高了数据查询的速度。

Ref:https://blog.csdn.net/qq_34935726/article/details/83039322  , https://blog.csdn.net/henry_lv/article/details/80384224

在提交事务(commit)之前可以用rollback回滚事务。

#commit、rollback用来确保数据库有足够的剩余空间;

#commi、rollback只能用于DML(除select之外)操作,即insert、update、delet;

# 事物只能回滚未commit的DML操作,对于已经commit的DML操作不能回滚,只能重新再写一条sql命令 执行你想要的操作。

四. 事物

事务机制可以确保数据一致性。Python DB API 2.0 的事务提供了两个方法 commit 或 rollback。

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

  • 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
  • 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  • 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

事物的使用场景: 针对以下场景就需要用事物将几个操作封装成原子操作  要么都成功,要么都失败

我去银行给朋友汇款,
我卡上有1000元,
朋友卡上500元,
我给朋友转账100元(无手续费),
如果,网线断了, 我的钱刚扣,而朋友的钱又没加时, 怎么办?

发布了118 篇原创文章 · 获赞 132 · 访问量 60万+

猜你喜欢

转载自blog.csdn.net/qfikh/article/details/103211586