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

1.这里相当于DBMS在3306端口监听 连接时候就是Navicat或Java程序这样连接过来

sqlSession 如何开启事务_sql


sqlSession 如何开启事务_sql_02


sqlSession 如何开启事务_sqlSession 如何开启事务_03


表的一行记录往往使用对象表示

sqlSession 如何开启事务_数据库_04


sqlSession 如何开启事务_java_05


从各种途径例如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(入职时间))
具体操作选择数据库 然后在顶部导航栏选中查询。然后新建查询写语句
那个 运行已选择的。就是只执行选中的行

举例

sqlSession 如何开启事务_java_06

二.事务介绍

1.什么是事务

sqlSession 如何开启事务_sqlSession 如何开启事务_07


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

sqlSession 如何开启事务_sql_08

2.事务和锁

sqlSession 如何开启事务_sql_09


说明事务和锁是有关系的

sqlSession 如何开启事务_sql_10


如果韩老师 在rollack什么也没写将回滚所有事务

可以回滚的前提条件

1.手动开启事务 2.设置相关的保存点

sqlSession 如何开启事务_sql_11

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

回退事务

sqlSession 如何开启事务_sqlSession 如何开启事务_12

3.提交事务

sqlSession 如何开启事务_java_13

案例

sqlSession 如何开启事务_sql_14


sqlSession 如何开启事务_sqlSession 如何开启事务_15

4.事务注意事项

sqlSession 如何开启事务_java_16


使用innodb才能使用事务

sqlSession 如何开启事务_sqlSession 如何开启事务_17


sqlSession 如何开启事务_隔离级别_18


sqlSession 如何开启事务_java_19

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点之后的数据 这个就叫不可重复读
注意:不可重复读和幻读的区别在于不可重复读指修改或删除
幻读指的是插入操作,其他都差不多

sqlSession 如何开启事务_数据库_20

二.查看事务隔离级别

sqlSession 如何开启事务_隔离级别_21

sqlSession 如何开启事务_数据库_22


mySQL默认隔离级别

sqlSession 如何开启事务_隔离级别_23


手动设置隔离级别

sqlSession 如何开启事务_sqlSession 如何开启事务_24


这里两边都启动事务 隔离级别与事务有关 启动事务才可以谈隔离级别

加锁 如果有一张表正在被操作没有提交 他会卡在这个地方不会操作非常神奇

– 演示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.设置事务隔离级别

sqlSession 如何开启事务_数据库_25

-- 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,一般情况下,没有特殊
-- 要求,没有必要修改(因为该级别可以满足绝大部分项目需求)

sqlSession 如何开启事务_java_26


修改my.ini配置文件更改默认隔离级别

7.mysql 事务 ACID

sqlSession 如何开启事务_数据库_27

1.原子性 要么都成功要么都失败 这两条语句若执行都得执行

sqlSession 如何开启事务_sqlSession 如何开启事务_28


2.一致性:他这个事务一旦提交过后 整体的进行改变 事务就结束了,开启一个新的事务 事务是一个整体 提交过后才会变为新的状态

3.隔离性:可重复读

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

sqlSession 如何开启事务_java_29


我这里重点给大家介绍三种: MyISAM、InnoDB、MEMORY

sqlSession 如何开启事务_隔离级别_30


sqlSession 如何开启事务_数据库_31


如何选择表的存储引擎 – 指令修改存储引擎

ALTER TABLE t29 ENGINE = INNODB

sqlSession 如何开启事务_sql_32