SQL之事务

1.前言:数据库三层结构-破除 MySQL 神秘

1.这里相当于DBMS在3306端口监听 连接时候就是Navicat或Java程序这样连接过来
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
表的一行记录往往使用对象表示
在这里插入图片描述
在这里插入图片描述
从各种途径例如java写的sql语句 或navicate里面写的 发了一条指令 把这条指令通过网络3306端口打到了这个DBMS服务上去(可以理解为mysqld.exe那个程序) DBMS拿到这条指令对对select*…进行解析 分析完之后DBMS帮我们执行 去具体的数据库DB1,DB2,DB3中再到表中找数据,找到数据成功后返回 这个表文件不是普通文件 是特别利于数据存储的有一套自己的数据管理方式 因此可以快速定位到某一条记录 将结果返回 返回之后客户端将结果展示

2.mysql事务

一.前言

DML语句 数据操作语句
一般包含用于对表中的数据操作的命令 如:新增数据 删除数据 修改数据 查询数据
命令关键字:insert,delete,update,select;
在mydb数据库中创建表 emp(id,eName,sal(工资,decimal(7,2)7是有效个数逗号后是2位 小数点之前就是5位),hiredate(入职时间))
具体操作选择数据库 然后在顶部导航栏选中查询。然后新建查询写语句
那个 运行已选择的。就是只执行选中的行

举例

在这里插入图片描述

二.事务介绍

1.什么是事务

在这里插入图片描述
我们在编程有一个需求 把一组sql语句当作一个整体 要么都成功要么都失败 select语句不算 对数据库的一致性来说毫无影响
在这里插入图片描述

2.事务和锁

在这里插入图片描述
说明事务和锁是有关系的
在这里插入图片描述
如果韩老师 在rollack什么也没写将回滚所有事务
可以回滚的前提条件
1.手动开启事务 2.设置相关的保存点

在这里插入图片描述

如果在12点执行了commit 语句 这两条语句相当于真正生效了 同时会将保存点ab删除 一旦提交事务 我们也就没有机会回退了
重点
执行了commit语句 没有机会回退 同时我们在回退的时候我们是可以选择回退到那个保持点的 同时注意我们一旦跳过b直接回退a 他将会把从12点到a点的所有的保存点删掉 我们是无法从a到b的

回退事务

在这里插入图片描述

3.提交事务

在这里插入图片描述

案例

在这里插入图片描述
在这里插入图片描述

4.事务注意事项

在这里插入图片描述
使用innodb才能使用事务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.事务隔离级别

一.事务隔离级别介绍

在不同的事务中 我们根据隔离的强度不同 那每一个事务看到表中同一个数据不一样 我们称之为事务的隔离级别
举例
这里有客户端c1 c2 都来操作数据库的某一张表t1 这里就涉及到隔离级别的问题 c1在操作表的时候 c2在看这种表的时候看到的是怎么样的数据取决于c2的隔离级别 不同的隔离级别
看到表中数据是不一样的
简单来说 c1在操作表时候 c2看到是怎样的数据是由隔离级别控制的
不可重复读:c1 c2同时操作数据库 如果在c2事务里面看到c1提交的动作 c2就发生了不可重复读 这时候就是不对的 因为c2事务就没有结束 理论就不应该看到c1提交的数据 c2连接点在连接数据库时间点10点同时我c2本来就想统计10点以前订单数据 但在10点01分c1也连接数据库对数据库进行修改删除添加操作 然后进行提交 c2就看到了10.01分提交的数据这里就是不对的 我本身就想统计10点之前的数据 结果看到10点之后的数据 这个就叫不可重复读
注意:不可重复读和幻读的区别在于不可重复读指修改或删除
幻读指的是插入操作,其他都差不多

在这里插入图片描述

二.查看事务隔离级别在这里插入图片描述

在这里插入图片描述
mySQL默认隔离级别
在这里插入图片描述
手动设置隔离级别
在这里插入图片描述
这里两边都启动事务 隔离级别与事务有关 启动事务才可以谈隔离级别
加锁 如果有一张表正在被操作没有提交 他会卡在这个地方不会操作非常神奇
– 演示mysql的事务隔离级别
– 1.开了两个mysg1的控制台
– 2.查看当前mysg1的隔离级别

	SELECT @@tx_isolation;
-- mysql> SELECT @@tx_isolation;
-- isolation 隔离
-- +-----------------+
-- | @@tx_isolation  |
-- +-----------------+
-- | REPEATABLE-READ |
-- +-----------------+
-- 3.把其中一个控制台的隔离级别设置 Read uncommitted
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 4.开始事务
START TRANSACTION;
-- 5.创建表
CREATE TABLE `account`(
				id INT,
				`name` VARCHAR(32),
				money INT
				);
-- 查询表
SELECT * FROM account;				
-- 表中添加记录
INSERT INTO account VALUES(100,'tom',1000);
-- 更新记录
UPDATE account SET money=800 WHERE id=100;
-- 再次添加记录
INSERT INTO account VALUES(200,'jack',2000);
-- 提交
COMMIT;
-- 插入数据
INSERT INTO account VALUES(300,'scott',8000);
INSERT INTO account VALUES(400,'milan',8000);
UPDATE account SET money=100 WHERE id=300;
SET SESSION TRANSACTION ISOLATION LEVEL Serializable;
INSERT INTO account VALUES(500,'terry',80000);
UPDATE account SET money=900 WHERE id=300;

6.设置事务隔离级别

在这里插入图片描述

-- 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配置文件更改默认隔离级别

7.mysql 事务 ACID

在这里插入图片描述

1.原子性 要么都成功要么都失败 这两条语句若执行都得执行
在这里插入图片描述
2.一致性:他这个事务一旦提交过后 整体的进行改变 事务就结束了,开启一个新的事务 事务是一个整体 提交过后才会变为新的状态
3.隔离性:可重复读

8.主要的存储引擎/表类型特点

在这里插入图片描述
我这里重点给大家介绍三种: MyISAM、InnoDB、MEMORY

加粗样式
在这里插入图片描述
如何选择表的存储引擎
– 指令修改存储引擎
ALTER TABLE t29 ENGINE = INNODB
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值