首页 > 数据库 >mysql事务

mysql事务

时间:2023-05-26 12:34:52浏览次数:55  
标签:事务 隔离 -- mysql 回退 级别

1. mysql 事务

1.1 什么是事务

事务用于保证数据的一致性,它由一组相关的dml语句组成该组的dml语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。

mysql事务_隔离级别

mysql事务_隔离级别_02

2. 事务和锁  796-797

当执行事务操作时(dml语句) ,mysql会在表 上加锁,防止其它用户改表的数据.这对用户来讲是非常重要的

2.1 演示

●mysql 数据库控制台事务的几个重要操作(基本操作transaction.sql)

1. start transaction --开始一个事务

2.savepoint保存点名--设置保存点

3. rollback to保存点名--回退事务

4. rollback --回退全部事务

5.commit --提交事务,所有的操作生效,不能回退

代码在E:\java学习\初级\course163\db_

transction_
#事务的一个重要概念和具体操作  797
-- 创建一张测试表
CREATE TABLE t27(
	id INT,
	`name` VARCHAR(32));
-- 开始事务
START TRANSACTION
-- 设置保存点
SAVEPOINT a
-- 执行dml操作
INSERT INTO t27 VALUES(100,'tom')
-- 在设置一个保存点
SAVEPOINT b
-- 再次执行dml操作
INSERT INTO t27 VALUES(200,'tom')
SELECT * FROM t27
-- 回退到b
ROLLBACK TO b
SELECT * FROM t27
-- 回退到a
ROLLBACK TO a
SELECT * FROM t27

-- 如果这样ROLLBACK(不加to), 表示直接回退到事务开始的状态
ROLLBACK 
COMMIT

2.2 细节:

1.没有设置保存点

2.多个保存点

3.存储引擎

4.开始事务方式

3. 回退事务  797

在介绍回退事务前,先介绍一 下保存点(savepoint).保存点是事务中的点.用于取消部分事务,当结束事务时(commit) ,会自动的删除该事务所定义的所有保存点当执行回退事务时,通过指定保存点可以回退到指定的点,这里我们作图说明

4. 提交事务  797

使用commit语句可以提交事务.当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,数据生效。当使用commit语句结束事务子后,其它会话[其他连接]将可以查看到事务变化后的新数据([所有数据就正式生效.]

5. 事务细节讨论  798

1.如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚

2.如果开始一个事务,你没有创建保存点.你可以执行rollback,默认就是回退到你事务开始的状态

3.你也可以在这个事务中(还没有提交时),创建多个保存点比如: savepoint aaa;执行 dml , savepoint bbb;

4.你可以在事务没有提交前,选择回退到哪个保存点

5. mysqI的事务机制需要innodb的存储引擎才可以使用,myisam不好使.

6.开始一个事务start transaction, set autocommit= off;

代码在E:\java学习\初级\course163\db_

transction_detail

# 讨论事务细节  798
-- 1.如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
INSERT INTO t27 VALUES(300,'milan')-- 自动commit提交
SELECT * FROM t27
-- 2.如果开始一个事务,你没有创建保存点.你可以执行rollback,
-- 默认就是回退到你事务开始的状态
START TRANSACTION-- 开启事务
INSERT INTO t27 VALUES(400,'king')
INSERT INTO t27 VALUES(500,'scott')
ROLLBACK-- 表示直接回退到事务开始的状态
SELECT * FROM t27
COMMIT
-- 3.你也可以在这个事务中(还没有提交时),创建多个保存点
-- 比如: savepoint aaa;执行 dml , savepoint bbb;
-- 4.你可以在事务没有提交前,选择回退到哪个保存点
-- 5. mysqI的事务机制需要innodb的存储引擎才可以使用,myisam不好使.
-- InnoDB 存储引擎支持事务 , MyISAM 不支持
-- 6.开始一个事务start transaction, set autocommit= off;
SET autocommit=off

6. mysql 事务隔离级别  799

6.1 事务隔离级别介绍  799

1. 多个连接开启各自事务操作数据库P数据时,数据库系统要负

责隔离操作,以保证各个连接在获取数据时的准确性。(通俗解释)

2.如果不考虑隔离性,可能会引发如下问题:

➢脏读

➢不可重复读

➢幻读

6.2 查看事务隔离级别  799-801

脏读(dirty read):当一个事务读取另一个事务尚未提交的改变(update,insert,delete)时,产生脏读

不可重复读(nonrepeatable read):同查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读。

幻读(phantom read):同查询在同事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。

说明:我们待会举例一个案例来说明mysql的事务隔离级别.以对account表的操作来说明.上面的几种情况.

我来做个通俗化解释,脏读就是有两个客户同时访问数据库时,a客户在对表进行操作,但是没有commit提交,这是b客户select就能看到a刚刚的操作,不可重复读和幻读其实差不多,不可重复读主要是针对修改或删除操作,幻读是针对插入操作,大概意思就是,a对表在进行插入或修改或删除操作后也commit了,但是b同样可以访问select到b的操作结果,这就是不可重复读和幻读,为什么这么说呢,大家觉得挺正常的,其实则不然,因为b访问表时。那时的表的数据还没有被改变,人家就是想要那时的数据,但是经过a这么一操作,表的数据改变了,b就读不到想读到的那时的数据了

6.3 事务隔离级别  799-801

概念:Mysq隔离级别定义了事务与事务之间的隔离程度。

mysql事务_mysql事务_03

6.4 mysql 的事务隔离级--案例  800-801

我们举例一个案例来说明mysql的事务隔离级别.以对account表进行操作为例。(id, name, money)

mysql事务_隔离级别_04

代码在E:\java学习\初级\course163\db_

set_transaction
#演示mysql事务的隔离级别   800
-- 开了两个mysql的控制台
-- 查看mysql的隔离级别
SELECT @@tx_isolation;
-- mysql> SELECT @@tx_isolation;
-- +-----------------+
-- | @@tx_isolation | 
-- +-----------------+
-- | REPEATABLE-READ | 
-- +-----------------+

-- 把其中一个控制台的隔离级别设置 Read uncommitted(读未提交)
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- 两个控制台都开启事务
-- 创建表
CREATE TABLE `account`(
	id INT,
	`name` VARCHAR(32),
	money INT);
	
-- 在其中一个控制台添加数据
INSERT INTO ACCOUNT VALUES(100,'tom',1000);
-- 然后在另一个控制台查看可以发现出现  脏读
SELECT * FROM ACCOUNT

-- 在其中一个控制台修改数据,会出现不可重复读
UPDATE ACCOUNT SET money = 800 WHERE id = 100;
-- 在其中一个控制台添加数据,会出现幻读
INSERT INTO ACCOUNT VALUES(200,'jack',2000);

-- 提交
COMMIT

-- 后面的具体操作看视频  800

6.5 设置事务隔离级别  802

1.查看当前会话隔离级别 

select @@tx_isolation;

2.查看系统当前隔离级别

select @@global.tx_isolation;

3. 设置当前会话隔离级别

set session transaction isolation level repeatable read; 

4.设置系统当前隔离级别

set global transaction isolation level repeatable read;

5. mysql 默认的事务隔离级别是repeatable read ,一般情况下,没有特殊要求,没有必要修改(因为该级别可以满足绝大部分项目需求)

●全局修改,修改my.ini配置文件,在最后加上

#可选参数有: READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.

在[mysqld]项最后面设置

transaction-isolation = REPEATABLE-READ

mysql事务_mysql_05

代码在E:\java学习\初级\course163\db_

set_transaction
-- 设置事务隔离级别  802
-- 1.查看当前会话隔离级别
SELECT @@tx_isolation
-- 2.查看系统当前隔离级别
SELECT @@global.tx_isolation
-- 3. 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 4.设置系统当前隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL[你需要设置的级别]
-- 5. mysql 默认的事务隔离级别是repeatable read ,一般情况下,没有特殊要求,
-- 没有必要修改(因为该级别可以满足绝大部分项目需求)

7. mysql 事务 ACID

7.1 事务的 acid 特性

1.原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

2. 一致性(Consistency)

事务必须使数据库从一个致性状态变换到另外一个一致性状态

3.隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

4.持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,

接下来即使数据库发生故障也不应该对其有任何影响

标签:事务,隔离,--,mysql,回退,级别
From: https://blog.51cto.com/u_15784725/6354948

相关文章

  • mysql表类型和存储引擎和视图
    1. mysql表类型和存储引擎  8031.1 基本介绍1. MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MyISAM、innoDB、Memory等。2. MySQL数据表主要支持六种类型,分别是: CSV、 Memory、ARCHIVE、MRG_MYISAM、MYISAM、 InnoBDB.3.这六种又分为两类,一类是”事务安全型”......
  • mysql用户管理
    1. Mysql 用户  808其中user表的重要字段说明:1. host: 允许登录的"位置”, localhost表示该用户只允许本机登录,也可以指定ip地址,比如:192.168.1.1002. user: 用户名;3. authentication string:密码,是通过mysql的password()函数加密之后的密码。1.1 创建用户  808cre......
  • Spring 事务常见错误。
    案例1:嵌套事务回滚错误假设我们需要对这个功能继续进行扩展,当学生注册完成后,需要给这个学生登记一门英语必修课,并更新这门课的登记学生数。为此,我添加了两个表。(https://www.java567.com,搜"spring")课程表course,记录课程名称和注册的学生数。 CREATETABLE`course`( ......
  • 数据库系列-MYSQL篇之-主从同步
    1主从同步概述mysql主从同步,即MySQLReplication,可以实现将数据从一台数据库服务器同步到多台数据库服务器。MySQL数据库自带主从同步功能,经过配置,可以实现基于库、表结构的多种方案的主从同步。可以对MySQL做主从架构并且进行读写分离,让主服务器(Master)处理写请求,从服务器(Sla......
  • MySQL中--skip-password参数作用
     MySQL中--skip-password参数探究 本篇使用客户端:mysql版本:MySQL8认证插件:mysql_native_password对于初始化数据库时,若是使用了--initialize-inscure选项,则对于用户root@localhost会使用空密码。2023-05-26T09:20:21.205673+08:006[Warning][MY-010453][Server]roo......
  • mysql创建用户及分配操作权限
    MySQL在安装时,会默认创建一个名为root的用户,该用户拥有超级权限,可以控制整个MySQL服务器,所以如果滥用root账户,对于系统来说是很不安全的。MySQL提供了以下3种方法创建用户。使用GRANT语句创建用户使用CREATEUSER语句创建用户在mysql.user表中添加用户1.使......
  • Spring 事务常见错误
    案例1:unchecked异常与事务回滚在系统中,我们需要增加一个学生管理的功能,每一位新生入学后,都会往数据库里存入学生的信息。我们引入了一个学生类Student和与之相关的Mapper。其中,Student定义如下:(https://www.java567.com,搜"spring") publicclassStudentimplementsSeria......
  • 关于MySQL的JDBC Driver加载过程详解
    在使用JDBC时,都需要提前加载对应数据库的Driver类,MySQL为例:Class.forName("com.mysql.jdbc.Driver")但是不写这句代码也可以让 com.mysql.jdbc.Driver类成功加载,这就涉及到java.sql.DriverManager类了,先看一下代码:publicclassDriverManager{//注册驱动的集合priva......
  • 5分钟搞定Linux安装Mysql5.7(简单快捷,建议收藏)
    本文记录下我近期在Linux环境下安装Mysql5.7的实践经历。服务器版本Mysql版本Centos7.65.7.321.下载Mysql下载地址:https://downloads.mysql.com/archives/community/进入页面后选择你需要的版本进行下载,这里提供了2种格式:tar.gz和tar。如果下载不方便,可以直接从我的网盘里面下......
  • MySQL常用命令
    #安装mysql后查看初始密码cat/var/log/mysqld.log#登录mysqlmysql-u[user]-p[密码]-h[远程主机ip]#本地登录可以简写为mysql-uroot-p#设置密码长度#【8.0】setglobalvalidate_password.length=6;#【5.7】setglobalvalidate_password_length=6;#设置......