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

相关推荐

  • HBase Shell Get 操作常用小技巧

    HBase Shell Get 操作常用小技巧在工作中,有时候只是想简单看下HBase表某些关键指标的值,这个时候总不能现写Java代码去查看,以下几个小技巧你可能会经常用到。 1. 某行有许多列,只想获取指定2~3列的数据 2. 想看某个字段多

    2023-02-14
    108
  • 如何使用pip在Python中安装pandas库

    如何使用pip在Python中安装pandas库
    Pandas 是一个高性能数据分析库,是基于 NumPy 的一种工具,该库是Python必备的数据处理/分析库之一,因为它可以方便地处理包含不同数据类型(如整数,浮点数和文本)的数据集。要使用 Pandas,必须先安装它。在本文中,我们将了解如何使用 pip 安装 Pandas。

    2024-04-22
    12
  • mysql数据库创建数据表的例子_命令创建数据库表

    mysql数据库创建数据表的例子_命令创建数据库表一、创建表的完整语法 1、创建表的语法 create table 表名( ​ 字段名1 字段类型(数字) 约束条件, ​ 字段名2 字段类型(数字) 约束条件, ​ 字段名3 字段类型(数字) 约束条

    2023-06-17
    103
  • 使用TextVariable来改变Tkinter小部件的值

    使用TextVariable来改变Tkinter小部件的值Tkinter是使用Python编写的标准GUI库,具有易学、易用、丰富多彩的特点。TextVariable是Tkinter的一个很有用的变量类型,可以用来动态改变Tkinter小部件的值,例如Label、Button等。该变量类型使得GUI应用程序可以非常灵活地响应用户的交互事件,从而实现更加智能、高效的功能。

    2023-12-09
    64
  • 存储过程条件判断_条件语句和循环语句

    存储过程条件判断_条件语句和循环语句条件语句部分 循环语句:有 **1.**REPEAT 直至条件表达式为True时执行的语句 UNTIL 条件表达式 END REPEAT; **2.**WHILE 条件表达式 DO 系列语句 END…

    2023-03-29
    104
  • 2.LinkedBlockingQueue[亲测有效]

    2.LinkedBlockingQueue[亲测有效]java.util.concurrent包下的新类。 实现接口:BlockingQueue LinkedBlockingQueue就是其中之一,是一个阻塞的线程安全的队列,底层采用链表实现。 Lin…

    2023-04-09
    151
  • select count(1)和count(2)的区别_select count(0)

    select count(1)和count(2)的区别_select count(0)select count(1) from 表a //查询时会对常数列进行统计行数select count(*) from 表a //查询时会找表a中最短的列进行统计行数 因为使用count(*)查询会

    2022-12-29
    106
  • 阿里云王创_基于阿里云物联网

    阿里云王创_基于阿里云物联网分享嘉宾:王怀远 阿里云 表格存储架构师 编辑整理:李瑶 DataFun 出品平台:DataFunTalk 导读: 大家好,我是王怀远,我2015年加入阿里云,一直从事表格存储的研发和架构相关工作,目

    2023-05-18
    97

发表回复

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