欢迎来到站长教程网!

MySQL

当前位置:主页 > 数据库 > MySQL >

MySQL 事务概念与用法深入详解(2)

时间:2020-05-22|栏目:MySQL|点击:

执行步骤:
1. 从老王媳妇账户读取数据
2. 从老王媳妇账户上减掉20元
3. 从老王账户读取数据
4. 给老王账户增加20元
5. 执行提交成功
6. 此时老王媳妇账户只有80元啦,而老王账户有30元啦,老王高兴不得了咯

mysql> begin; Query OK, 0 rows affected (0.01 sec) mysql> update account set balance=balance-20 where id = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> update account set balance=balance+20 where id = 2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> commit; Query OK, 0 rows affected (0.01 sec)

#账户余额: mysql> select * from account; +----+--------------+---------+ | id | name | balance | +----+--------------+---------+ | 1 | 老王媳妇 | 80 | | 2 | 老王 | 30 | +----+--------------+---------+

完整的回滚例子 2月份,老王本来表现得很棒,坚持干家务活和遛狗,老王媳妇要给他25元的零花钱,可老王不经夸啊,老王媳妇正在给老王转零花钱时,突然看到桌子上老王手机收到一条小女生发来的微信:亲爱的王哥....,老王媳妇特别生气,一怒之下撤回了转账,取消这个月的零花钱。

执行步骤:
1. 从老王媳妇账户读取数据
2. 从老王媳妇账户上减掉25元
3. 从老王账户读取数据
4. 给老王账户增加25元
5. 此时老王媳妇撤回之前的操作
6. 此时,老王和老王媳妇的账户余额还是保持操作之前的数目

mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> update account set balance=balance-25 where id = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> update account set balance=balance+25 where id = 2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> rollback; Query OK, 0 rows affected (0.00 sec)

#账户余额: mysql> select * from account; +----+--------------+---------+ | id | name | balance | +----+--------------+---------+ | 1 | 老王媳妇 | 80 | | 2 | 老王 | 30 | +----+--------------+---------+

事务支持的存储引擎

1. InnoDB 2. NDB

不支持的存储引擎,比如在MyISAM上操作事务,事务不会生效,SQL语句直接自动执行提交,所以回滚对于不支持事务的存储引擎是无效的。

create table tb1( -> id int(10) auto_increment, -> name varchar(30), -> primary key (id) -> )engine=myisam charset=utf8mb4; mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into tb1(name) values('Tom'); Query OK, 1 row affected (0.01 sec) mysql> select * from tb1; +----+------+ | id | name | +----+------+ | 1 | Tom | +----+------+ 1 row in set (0.00 sec) mysql> rollback;//回滚无效 Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> select * from tb1; +----+------+ | id | name | +----+------+ | 1 | Tom | +----+------+ 1 row in set (0.00 sec)

事务的设置与查看

#查看事务开启情况: mysql> SHOW VARIABLES LIKE 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+

默认是事务自动提交的,每执行一条SQL就自动提交。

此时需要操作事务,则需要显式开启(begin or start transaction)和提交(commit)或回滚(rollback)。

如设置成OFF,则需要执行提交(commit)或回滚(rollback)操作时才会真正执行事务。

关闭自动提交方式 第一种 显式的的使用START TRANSACTION或者BEGIN语句开启一个事务。 第二种 把系统变量autocommit的值设置为OFF。

SET autocommit = OFF;

隐式提交情况 当我们使用START TRANSACTION或者BEGIN语句开启了一个事务,或者把系统变量autocommit的值设置为OFF时,事务就不会进行自动提交,但是如果我们输入了某些语句之后就会悄悄的提交掉,就像我们输入了COMMIT语句了一样,这种因为某些特殊的语句而导致事务提交的情况称为隐式提交 定义或修改数据库对象的数据定义语言(Data definition language,缩写为:DDL) 所谓的数据库对象,指的就是数据库、表、视图、存储过程等等这些东西。当我们使用CREATE、ALTER、DROP等语句去修改这些所谓的数据库对象时,就会隐式的提交前边语句所属于的事务。

BEGIN; SELECT ... # 事务中的一条语句 UPDATE ... # 事务中的一条语句 ... # 事务中的其它语句 CREATE TABLE ... # 此语句会隐式的提交前边语句所属于的事务

隐式使用或修改mysql数据库中的表 隐式使用或修改mysql数据库中的表。

当我们使用ALTER USER、CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD等语句时也会隐式的提交前边语句所属于的事务。

事务控制或关于锁定的语句 事务控制或关于锁定的语句。

当我们在一个事务还没提交或者回滚时就又使用START TRANSACTION或者BEGIN语句开启了另一个事务时,会隐式的提交上一个事务。

上一篇:MySQL数据库主从同步实战过程详解

栏    目:MySQL

下一篇:mysql8.0.20下载安装及遇到的问题(图文详解)

本文标题:MySQL 事务概念与用法深入详解(2)

本文地址:http://www.blue1000.com/shujuku/MySQL/1387.html

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:1961407250 | 邮箱:1961407250#qq.com(#换成@)

Copyright © 2002-2022 BK网络学院版权所有 Power by DedeCms 粤ICP备19027147号-7