专栏首页浪子编程走四方MySQL事务处理操作

MySQL事务处理操作

什么是事务

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务.

事务的使用要求

要想数据表支持事务,表存储引擎必须是Innodb.

事务的几大特性

. 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样. . 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作. . 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable). . 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失.

如何使用事务

1.方式一

begin/start transaction
....
rollback # 当使用了rollback,之前的操作全部进行回退
....
commit # 只要执行了commit,数据就实现了持久化存储,使用rollback是无法回退

2.方式二 在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

set autocommit=0 # 关闭自动提交
....
rollback # 当使用了rollback,之前的操作全部进行回退
....
commit # 只要执行了commit,数据就实现了持久化存储,使用rollback是无法回退

事务控制语句

.BEGIN或START TRANSACTION;显式地开启一个事务; .COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改成为永久性的; .ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改; .SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT; .RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常; .ROLLBACK TO identifier;把事务回滚到标记点; .SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ .UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

使用演示

.事务实现第一种方式

mysql> select * from user;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | admin001 |  12 |
|  2 | admin002 |  13 |
+----+----------+-----+
2 rows in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update user set age = 13 where id =1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from user;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | admin001 |  13 |
|  2 | admin002 |  13 |
+----+----------+-----+
2 rows in set (0.01 sec)

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from user;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | admin001 |  12 |
|  2 | admin002 |  13 |
+----+----------+-----+
2 rows in set (0.00 sec)

. 事务实现的第二种方式

mysql> select * from user;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | admin001 |  13 |
|  2 | admin002 |  13 |
+----+----------+-----+
2 rows in set (0.00 sec)

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> update user set age=11 where id =1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from user;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | admin001 |  11 |
|  2 | admin002 |  13 |
+----+----------+-----+
2 rows in set (0.01 sec)

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from user;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | admin001 |  13 |
|  2 | admin002 |  13 |
+----+----------+-----+
2 rows in set (0.00 sec)

. 事务存点以及回退操作

mysql> select * from user;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | admin001 |  13 |
|  2 | admin002 |  13 |
+----+----------+-----+
2 rows in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.02 sec)

mysql> update user age = 12 where id =1 ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= 12 where id =1' at line 1
mysql> update user set age = 12 where id =1 ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> savepoint updateUserAge;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | admin001 |  12 |
|  2 | admin002 |  13 |
+----+----------+-----+
2 rows in set (0.00 sec)

mysql> update user set name = 2 where id =1 ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from user;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | 2        |  12 |
|  2 | admin002 |  13 |
+----+----------+-----+
2 rows in set (0.00 sec)

mysql> savepoint updateUserName;
Query OK, 0 rows affected (0.00 sec)

mysql> rollback to updateUserAge;
Query OK, 0 rows affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.02 sec)

mysql> select * from user;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | admin001 |  12 |
|  2 | admin002 |  13 |
+----+----------+-----+
2 rows in set (0.00 sec)

PHP如何使用事务

<?php
$mysqli = new mysqli('127.0.0.1', 'root', 'QQadmin001', 'test');
if($mysqli->connect_errno) {
        var_dump($mysqli->connect_error);
}else{
        $mysqli->query("start transaction");
        $sql = "update user set age = 30 where id = 1";
        $res = $mysqli->query($sql);
        if($res) {
          $mysqli->query("rollback");
        }
}

事务的使用场景

. 当操作涉及到数据关联。如删除文章类型,需要删除该类型下面的文章,当文章删除成功后才能做提交,当没删除成功时,则回退到最初时的位置. . 银行转账. . 用户记录操作

本文分享自微信公众号 - 卡二条的技术圈(gh_0275b8ba153f),作者:编程浪子走四方

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • mysql主从复制读写分离与高可用配置

    前面我们说了mysql的安装配置(并提供一键安装脚本),mysql语句使用以及备份恢复mysql数据;本次要介绍的是mysql的主从复制,读写分离;及高可用MH...

    A梦多啦A
  • MySQL中不得不提的事务处理

    记得前些日子分享过一篇有关MySQL中事务的知识点,但当时对MySQL中的事务只是纯粹的知道如何使用,缺乏对理论的进一步认识,抽时间单独去了解了一下,便在做一个...

    A梦多啦A
  • 玩转dnmp之MySQL实现主从复制操作

    修改环境配置,我们要涉及到两个配置文件,一个是.env文件,一个是docker-compose.yml文件。

    A梦多啦A
  • MySQL事务学习-->隔离级别

    程序员同行者
  • MySQL 之事务

    什么是事务? 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)。

    小手冰凉
  • ModuleNotFoundError: NO model named 'XXX'

    于小勇
  • 给自己的一份自学IOS开发的学习清单

    1、关于工具Xcode: -熟悉xcode的界面及开发流程。 -学习资料: Xcode7互动教程app -学习方法: 使用手指学...

    mixlab
  • 从SAP最佳业务实践看企业管理(156)-WM-624包括分配运行的仓库管理

    WM 624包括分配运行的仓库管理 本流程表述了在分销中心针对货物的不带HUM的仓库管理,包含以下功能: 补货 创建转储要求 创建转储要求的转储单 确认转储单 ...

    SAP最佳业务实践
  • Maven详细介绍

    如何回答这个问题要看你怎么看这个问题。 绝大部分Maven用户都称Maven是一个"构建工具":一个用来把源代码构建成可发布的构件的工具。 构建工程师和项目经理...

    WindWant
  • 将List转化为Map的通用方法—泛型方法的简单运用

    有时候我们需要将List转化为Map,将数据散列存储,以提高查询效率。但是集合类中所存放的对象类型是不同的,因此,针对不同类型,我们常会写多个逻辑重复的转化方法...

    java达人

扫码关注云+社区

领取腾讯云代金券