mysql 08事务——个人笔记

博客主要围绕MySQL数据库的事务展开,指出事务是一组要么全成功要么全失败的操作,在引擎层实现,InnoDB引擎支持事务,具备原子性、一致性、隔离性和持久性,还介绍了隔离性导致的结果差异、修改隔离级别,以及表复制和事务的开启、提交、回滚等操作,同时提到MyISAM引擎不支持事务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql 数据库的事务

  • 我们把一组操作 看做一件事,要么全成功要么全失败。

  • mysql事务是在引擎层实现的

  • innodb引擎支持事务

  • a atomicity 原子性

  • c consistency 一致性

  • i isolation 隔离性

  • d durability 持久性

隔离性

##### 隔离级别   从低到高   

1 读未提交   read uncommitted  
   一个事务 还没有提交  这时候所做的变更被其它事务看到了      脏读   如何解决脏读   读提交 


2读提交    read committed
   一个事务提交以后他所做的变更才会被其它事务看到   
    问题 :  不可重复读 (同一个事务 同样的查询 两次结果不一样 )  如何解决  可重复读       -------   针对于更新操作  

3可重复读  repeatable read 
  开始读数据的时候  不允许你再更新 update 了 
   一个事务 执行过程中看到的数据总是跟这个事务在启动的时候看到的数据是一致的,未提交的变更对于其它事务也是不可见的
     出现问题  : 幻读  ---------- 针对的是 insert 操作  

4序列化 串行化     serializable 
  读+读锁    写 + 写锁  当出现读写冲突的时候 后边的事务必须等到前面的事务执行完成才可以   

Oracle      SQL Server      默认隔离级别  是  read committed 读提交

隔离性导致的结果差异

在这里插入图片描述

问题 : 不同的隔离级别  V1 V2 V3的值分别是什么?

1. 读未提交    V1 是2  V2 V3也是 2  事务B虽然没有提交但是 变更已经被A看到了

2. 读提交 V1 是 1  V2的值是2  V3 也是2  

3. 可重复读    事务在执行期间看到数据前后必须是一致的 所以 事务A提交之前 看得到的值 跟刚开始看到的是一样的 

   所以V1 V2的值是 1  V3 2  

4. 事务B将1改成2 上锁 事务A提交以后 事务B才可以继续执行 从A的角度看 V1 V2 1 V3的值是2 



总结: 不同的隔离级别  结果是不一样的  如果有需求 将数据库迁移 比如将mysql 迁移到 Oracle 一定要注意修改隔离级别 

修改隔离级别

查看隔离级别
show variables like 'transaction_isolation';  

修改
编辑  C:\ProgramData\MySQL\MySQL Server 5.7\my.ini  

[mysqld] 
transaction-isolation =  REPEATABLE-READ 

表复制

mysql> create table stars1 like stars;  #复制stars表 为 stars1 

mysql> insert into stars1 select * from stars; 
上面是复制结构下面是辅助数据

赋值结构和数据
CREATE TABLE a4 (SELECT
		*
			
from table
)


事务

  • begin 开启事务 start transaction 开启事务

  • commit 提交事务 rollback 回滚事务

  • myisam 引擎不支持事务

  • 回滚必须在提交之前

1构建表
create table stansaction(id int primary key auto_increment,uname varchar(20) not null);

2插入数据
insert into stansaction(uname) values("狗本人"),("李白"),("王昭君"),("刘禹锡"),("纳兰容若");

3开启事务
delete from stansaction where id >4;

在查看一次
select * from stansaction;
+----+--------+
| id | uname  |
+----+--------+
|  1 | 狗本人 |
|  2 | 李白   |
|  3 | 王昭君 |
|  4 | 刘禹锡 |
+----+--------+

发现被干死了 没关系我没回滚


rollback;
select * from stansaction;
 
+----+----------+
| id | uname    |
+----+----------+
|  1 | 狗本人   |
|  2 | 李白     |
|  3 | 王昭君   |
|  4 | 刘禹锡   |
|  5 | 纳兰容若 |
+----+----------+


2还可以设置回滚点多次回滚

	1 delete from stansaction  where id = 4;
	1 savepoint p1;
	
	2 delete from stansaction  where id = 2;
	2 delete from stansaction  where id = 5;
	2 savepoint p3;
	
	3 delete from stansaction;
	
	3 select * from stansaction;
	Empty set (0.00 sec)
	
	4 rollback to p3;
	select * from stansaction;
	+----+--------+
	| id | uname  |
	+----+--------+
	|  1 | 狗本人 |
	|  3 | 王昭君 |
	+----+--------+

	5 rollback to p1;
	 select * from stansaction;
	+----+----------+
	| id | uname    |
	+----+----------+
	|  1 | 狗本人   |
	|  2 | 李白     |
	|  3 | 王昭君   |
	|  5 | 纳兰容若 |
	+----+----------+
	
	6 rollback to p3;
	报错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值