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个操作就是一个原子操作。要么一起执行成功,要么一起失败,不能一个成功一个失败,两者是一个整体
事务课后练习