SQL之Mysql事务的概念与应用[通俗易懂]

SQL之Mysql事务的概念与应用[通俗易懂]目录 1. 前言 2. 事务的四大特性 3. 三类数据读问题 3.1 Dirty Read(脏读): 3.2 Unrepeatable Read(不可重复读) 3.3 Phantom Read(幻读…

SQL之Mysql事务的概念与应用

代码分享:https://github.com/mtdgclub/PDO

具体查看根目录下的pdoAffair.php文件代码

2. 事务的四大特性

  • 原子性:事务必须是一个不可分割的整体,要么做完,要么不做。
  • 一致性:事务执行前和执行后来源和去向保持平衡,数据不会被破坏。
  • 隔离性:并发时每个事务是隔离的,相互不影响。
  • 持久性:事务一旦成功提交,就会永久保存到数据库中。

原子性是基础,隔离性是手段,持久性是目的,真正的老大就是一致性。

3. 三类数据读问题

3.1 Dirty Read(脏读)

事务 A 读取了事务 B 未提交的数据,并在这个基础上又做了其他操作。

SQL之Mysql事务的概念与应用[通俗易懂]

3.2 Unrepeatable Read(不可重复读)

事务 A 读取了事务 B 已提交的更改数据。

SQL之Mysql事务的概念与应用[通俗易懂]

3.3 Phantom Read(幻读)

事务 A 读取了事务 B 已提交的新增数据。

SQL之Mysql事务的概念与应用[通俗易懂]

3.4 不可重复读和幻读的区别

  • 不可重复读的重点是修改,避免不可重复读需要锁行
  • 幻读的重点在于新增或者删除,避免幻读需要锁表

4.两类数据更新问题

4.1 第一类丢失更新(撤销覆盖)

A事务撤销时,把已经提交的B事务的更新数据覆盖了。

SQL之Mysql事务的概念与应用[通俗易懂]

4.2 第二类丢失更新(提交覆盖)

B事务覆盖A事务已经提交的数据,造成A事务所做操作丢失

SQL之Mysql事务的概念与应用[通俗易懂]

5.隔离的级别

SQL之Mysql事务的概念与应用[通俗易懂]

5.1 MySQL

mysql默认的事务处理级别是”REPEATABLE-READ”,也就是可重复读

  • 查看当前会话隔离级别

select @@tx_isolation;

  • 查看系统当前隔离级别

select @@global.tx_isolation;

  • 设置当前会话隔离级别

set session transaction isolatin level repeatable read;

  • 设置系统当前隔离级别

set global transaction isolation level repeatable read;

5.2 Oracle

oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。默认系统事务隔离级别是READ COMMITTED,也就是读已提交。

  • 查看系统默认事务隔离级别,也是当前会话隔离级别

–首先创建一个事务

declare

     trans_id Varchar2(100);

  begin

     trans_id := dbms_transaction.local_transaction_id( TRUE );

  end; 

–查看事务隔离级别

SELECT s.sid, s.serial#,

CASE BITAND(t.flag, POWER(2, 28))

WHEN 0 THEN “READ COMMITTED”

ELSE “SERIALIZABLE”

END AS isolation_level

FROM v$transaction t

JOIN v$session s ON t.addr = s.taddr AND s.sid = sys_context(“USERENV”, “SID”);

6.事务实现步骤

归纳以下几点重要步骤:

  • 关闭自动提交功能

$mysqli->autocommit(false);

  • 视情况创建回滚点

$mysqli->savepoint a;

  • 执行失败则回滚

$mysqli->rollback();

  • 执行成功则提交

$mysqli->commit();

7.实战事务回滚案例

7.1 数据库结构

CREATE TABLE `t_user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `username` varchar(255) DEFAULT NULL,

  `mobile` varchar(13) NOT NULL,

  `password` varchar(255) NOT NULL,

  PRIMARY KEY (`id`),

  KEY `FindUserId` (`mobile`,`password`)

) ENGINE=MyISAM AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;

7.2 案例代码实战

<?php
//创建一个mysqli对象
$mysqli = new MySQLi(“localhost”, “root”, “root”);
$mysqli->select_db(“myyaf”);
//判断是否链接成功
if ($mysqli->connect_error) {
    die($mysqli->connect_error);
}
//由于在事务提交中系统默认提交,故这里设置为FALSE先不提交
$mysqli->autocommit(false);
//其实这里系统已经相当在这里做个保存点,记录此时所有状态,回滚是回滚到这里
$mysqli->savepoint(“a”);
//写出对数据库的操作语句
for ($i = 0; $i <= 30; $i++) {

    $sql = “…..”;
    //执行sql语句
    $res = $mysqli->query($sql) or die ($mysqli->error.”<br/>”.$sql);
    //判断是否都执行成功
    if ($res) {
        //只要有一条失败便回滚,都不执行,若设置滚回点,如a,则回滚到a处
        $mysqli->rollback();
    } else {
        //一旦提交无法回滚,成功则提交
        $mysqli->commit();
    }
}
//关闭资源
$mysqli->close();

8.总结

对于数据库的事务,其实当你能够理解事务的概念,再结合实际应用场景,就能很好地使用,一般来说,一些对数据高严谨的程序都会使用事务来执行CURD操作。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9045.html

(0)
上一篇 2023-02-16
下一篇 2023-02-16

相关推荐

  • 打造交互式GUI:Python Tkinter实战教程

    打造交互式GUI:Python Tkinter实战教程Graphical User Interface(GUI),即图形用户界面,是指使用图形方式显示在计算机屏幕上的视觉元素和控件,用户可以通过它们与程序进行交互。 在本教程中,我们将使用Python Tkinter库来创建GUI。

    2024-03-12
    75
  • ClickHouse(06)ClickHouse的数据表创建语句详细解析「建议收藏」

    ClickHouse(06)ClickHouse的数据表创建语句详细解析「建议收藏」当前服务器上创建表(单节点) 创建新表具有几种种语法形式,具体取决于用例。默认情况下,仅在当前服务器上创建表。分布式DDL查询作为子句实现,该子句另外描述。 语法形式 使用显式架构 CREATE TA

    2023-06-06
    148
  • 使用Python中的类来操作列表

    使用Python中的类来操作列表在Python中,类是一种抽象的概念,可以想象成是一个模板或是蓝图,用来描述一类对象的共同属性和方法。我们可以根据类创建出一些具体的对象,这些对象拥有相同的属性和方法。下面是一个简单的类定义:

    2024-01-04
    119
  • Python Selenium实现无头模式下的H1标题输出

    Python Selenium实现无头模式下的H1标题输出Python Selenium是一种Web自动化测试工具,可以模拟用户在浏览器中进行的各种操作,解析网页数据并与数据库进行交互。运用Python Selenium,可以在无需人工干预的情况下,完成浏览器操作及数据抓取的自动化工作。

    2024-04-15
    77
  • Python Sum详解

    Python Sum详解Python中的Sum函数是一个非常有用的函数,其功能是将一个可迭代对象中的所有元素相加。它的好处是,可以将一个列表或其他可迭代对象中的元素相加,而不需要编写复杂的代码。本文将详细介绍Python中的Sum函数以及它的实现和使用方法。

    2024-05-22
    68
  • 计算Python中数据的长度

    计算Python中数据的长度Python 是一种强大的编程语言,能够对各种数据进行处理和计算。在使用 Python 进行数据处理的过程中,经常需要计算数据的长度。本篇文章将从多种数据类型的计算以及实际应用场景中介绍如何计算 Python 中数据的长度。

    2024-04-05
    71
  • Mysql实战45讲 百度网盘_MySQLPHP

    Mysql实战45讲 百度网盘_MySQLPHPMySQL实战45讲 20 幻读 间隙锁 next-key lock

    2023-05-29
    140
  • Python字典:高效存储和管理数据

    Python字典:高效存储和管理数据Python字典是一种可变容器模型,且内部元素无序,元素以键值对的形式存储。其中,键必须唯一,可以是任意不可变类型,例如整数、浮点数或字符串,值可以是任意类型的Python对象。字典可以通过键来快速访问其值,它比列表和元组等容器的访问效率更高。

    2023-12-14
    112

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注