Mysql事务

dml:增 删 改 语句

事务有什么用

对事务的理解

  • 当我们的2条语句其中有一条没有成功的化,将会出现问题
  • 事务的引出

    下图:为需求演示图

    需求概括:演示事务的回滚
    回滚前提
    1.需要开始一个事务
    2.有设置的相关的保存点

如果进行了事务提交,会将保存点删除,将没有后悔药,不能进行回退

我们的一个数据库可以连接多个客户端。当我们进行事务操作时,在我们提交事务后,我们的数据才会生效,其他连接的客户端才能看到生效的数据

-- 事务的重要概念和具体操作

-- 演示示意图的事务操作

-- 1.创建一张表
CREATE TABLE t29(
	id INT ,
	`name` VARCHAR(32))
	
-- 2.开始事务
START TRANSACTION

-- 3.设置一个保存点(将事务开始的点设置为保存点a)
SAVEPOINT a	-- 这个保存点的名字可以任意取
-- 执行dml操作
INSERT INTO t29 VALUES(100,'tom');-- 插入信息

SELECT * FROM t29
-- 4.设置保存点
SAVEPOINT b;-- 设置保存点b 
-- 执行dml操作
INSERT INTO t29 VALUES(200,'jack')

SELECT * FROM t29-- 此时表中有2条记录了

-- 5回退到保存点b

ROLLBACK TO b

SELECT * FROM t29-- 此时表中只有tom的记录了

-- 6.继续回退到a保存点

ROLLBACK TO a 

SELECT * FROM t29-- 现在表中已经没有记录了

-- 注意1.
ROLLBACK -- 回退时不写保存点,则是回退到事务开始
-- 注意2.
COMMIT 提交事务时,将不能进行回退了
-- 注意点3
当它回退到a点时,会将a点后面所有的保存点都删除掉(不能反向回退)





事务注意事项

Mysql 4种隔离级别

在不同的事务中,根据隔离的强度不同,每一个事务看到的同一张表的数据不一样,将称为事务的隔离的级别


客户端c1在一张表进行操作,而此时c2正在查询这张表。c2能操作到这张表的内容由c1的隔离级别决定
个人基本理解:2个或多个事务同时操作数据库时 事务还没有操作结束所带来的一系列影响

加锁:发现一个表正在被一个事务操作时,就不会去允许别人操作这个表了

  • 4种隔离级别

隔离级别演示1


需要模拟2个控制台连接同一个数据库的情况

此时已经有2个客户端连接到同一个数据库

注意:隔离级别是和事务相关的,离开事务就不要谈隔离级别

需求是:我需要查询的是我连接到数据库那一瞬间的数据。不希望收到别到连接的影响

产生脏读时所影响的事务还没有提交,产生幻读和不可重复读时所影响的事务已经提交了

网友经验:需要先改变隔离状态,然后再开始新的事务

隔离级别2演示

可重复读的意思是:保证每次读的数据是一样的

可串行化:如果发现一张表正在操作没有提交,另一个想要操作这个表的事务会被卡在那里不能对该表进行操作

如上图所示:A在操作这个表的时候,他的事务没有提交,B去操作这个表的时候,B会去检查A的时候有没有提交,如果没有提交B将会在这里等待。提交后才能进行操作

老师进行演示了可串行化的事务不能进行select操作,不知道别到操作能不能进行,待实验

演示隔离级别的语句

设置隔离

  • 可以设置或者修改默认的隔离级别

    Mysql事务的ACID特性
  • 原子性

    如上图的2个操作就是一个原子操作。要么一起执行成功,要么一起失败,不能一个成功一个失败,两者是一个整体


事务课后练习

posted @ 2023-04-17 15:24  一往而深,  阅读(40)  评论(0)    收藏  举报