01.事务的基本介绍

数据库事务及隔离级别 - 图1A.概念:
数据库事务及隔离级别 - 图2如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
数据库事务及隔离级别 - 图3B.操作:
数据库事务及隔离级别 - 图4开启事务:
数据库事务及隔离级别 - 图5start transaction;
数据库事务及隔离级别 - 图6开启事务后,所有的数据改变都是临时的,需要进行回滚或提交才能奏效。
回滚:
数据库事务及隔离级别 - 图7rollback;
数据库事务及隔离级别 - 图8数据库事务及隔离级别 - 图9将数据回滚都开启事务之前。
提交:
数据库事务及隔离级别 - 图10commit;
数据库事务及隔离级别 - 图11将数据进行提交。
数据库事务及隔离级别 - 图12C.测试

  1. ‐‐ 创建账户表
  2. CREATE TABLE account (
  3. id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10),
  4. money DOUBLE
  5. );
  6. ‐‐ 添加数据
  7. INSERT INTO account (NAME, money) VALUES ('zhangsan', 1000), ('lisi', 1000);


数据库事务及隔离级别 - 图13D.MySQL数据库中事务默认自动提交
事务提交的两种方式:
数据库事务及隔离级别 - 图14自动提交:
数据库事务及隔离级别 - 图15mysql就是自动提交的
数据库事务及隔离级别 - 图16一条DML(增删改)语句会自动提交一次事务。
手动提交:
数据库事务及隔离级别 - 图17Oracle 数据库默认是手动提交事务
数据库事务及隔离级别 - 图18需要先开启事务,再提交
修改事务的默认提交方式:
数据库事务及隔离级别 - 图19查看事务的默认提交方式:SELECT @@autocommit; — 1 代表自动提交 0 代表手动提交

02_事务的四大特征:

数据库事务及隔离级别 - 图20原子性:
数据库事务及隔离级别 - 图21是不可分割的最小操作单位,要么同时成功,要么同时失败。
数据库事务及隔离级别 - 图22持久性:

数据库事务及隔离级别 - 图23当事务提交或回滚后,数据库会持久化的保存数据。
隔离性:
数据库事务及隔离级别 - 图24多个事务之间。相互独立。
数据库事务及隔离级别 - 图25事实上事务之间是存在一定的影响的,需要理解隔离级别。
一致性:
数据库事务及隔离级别 - 图26事务操作前后,数据总量不变
数据库事务及隔离级别 - 图27比如:转账前后,两个用户的金额总数不变。

03_事务的隔离级别(了解)

数据库事务及隔离级别 - 图28A.概念:
数据库事务及隔离级别 - 图29多个事务之间隔离的,相互独立的。但是如果多个事务并发操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
数据库事务及隔离级别 - 图30B.存在问题:
数据库事务及隔离级别 - 图31脏读:一个事务,读取到另一个事务中没有提交的数据
如果存在脏读,银行转账,容易出现欺诈事件。
数据库事务及隔离级别 - 图32不可重复读:在同一个事务中,两次读取到的数据不一样。
数据库事务及隔离级别 - 图33幻读(虚读):一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
数据库事务及隔离级别 - 图34C.隔离级别:
数据库事务及隔离级别 - 图35read uncommitted:读未提交
数据库事务及隔离级别 - 图36产生的问题:脏读、不可重复读、幻读
数据库事务及隔离级别 - 图37read committed:读已提交 (Oracle默认)
数据库事务及隔离级别 - 图38解决了脏读, 产生的问题:不可重复读、幻读
数据库事务及隔离级别 - 图39repeatable read:可重复读 (MySQL默认)
数据库事务及隔离级别 - 图40解决了脏读、不可重复读, 产生的问题:幻读
数据库事务及隔离级别 - 图41serializable:序列化
数据库事务及隔离级别 - 图42解决所有的问题,但是并发效率低
数据库事务及隔离级别 - 图43注意:隔离级别从小到大安全性越来越高,但是效率越来越低
数据库查询隔离级别:
数据库事务及隔离级别 - 图44select @@tx_isolation;
数据库事务及隔离级别 - 图45数据库设置隔离级别:
数据库事务及隔离级别 - 图46设置mysql全局的隔离级别:需要关闭当前窗口才能会生效。
set global transaction isolation level 隔离级别;
数据库事务及隔离级别 - 图47设置当前窗口的隔离级别:不需要关闭当前窗口就能生效。
set session transaction isolation level 隔离级别;

04_演示脏读的发生

数据库事务及隔离级别 - 图48A.脏读:一个事务读到另一个事务未提交的数据.
步骤一:开启两个窗口A,B.
数据库事务及隔离级别 - 图49分别连接到MYSQL服务器.
数据库事务及隔离级别 - 图50步骤二:查看两个窗口的隔离级别:

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539927672-503bd47b-2af7-4e29-8ea3-065daad8ec36.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)select @@tx_isolation;<br />![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539927922-57ad28df-b5e8-4da6-bb81-ed9289df1eb0.png#align=left&display=inline&height=19&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=4&status=done&style=none&width=4)步骤三:设置A、B窗口隔离级别为read uncommitted:<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539925656-639451d3-2751-4c21-9174-23cd6b0862c1.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)set session transaction isolation level read uncommitted;<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539926688-c20ce907-e178-4d46-9347-4250106e2731.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)分别查看A,B两个窗口的隔离级别:<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539925920-28590266-ce13-4009-8d23-f19850116f4a.png#align=left&display=inline&height=19&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=4&status=done&style=none&width=4)A窗口:read uncommitted<br />![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539925920-28590266-ce13-4009-8d23-f19850116f4a.png#align=left&display=inline&height=19&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=4&status=done&style=none&width=4)B窗口:read uncommitted <br />步骤四:分别在两个窗口中开启事务:<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539927672-503bd47b-2af7-4e29-8ea3-065daad8ec36.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)start transaction;<br />![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539927922-57ad28df-b5e8-4da6-bb81-ed9289df1eb0.png#align=left&display=inline&height=19&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=4&status=done&style=none&width=4)步骤五:在B窗口完成转账的操作:<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539925656-639451d3-2751-4c21-9174-23cd6b0862c1.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)update account set money = money - 1000 where name = 'aaa';<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539926688-c20ce907-e178-4d46-9347-4250106e2731.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)update account set money = money + 1000 where name = 'bbb'; <br /> 没有提交事务<br />![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539926688-c20ce907-e178-4d46-9347-4250106e2731.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)步骤六:在A窗口查询账号的信息. <br />select * from account;<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539927672-503bd47b-2af7-4e29-8ea3-065daad8ec36.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)已经转账成功!

05_演示不可重复读的发生(解决脏读)

数据库事务及隔离级别 - 图51为了解决脏读问题,将隔离级别设置为read committed,这样就只能读到提交的数据。但是依然存在不可重复读问题!
数据库事务及隔离级别 - 图52不可重复读
数据库事务及隔离级别 - 图53在一个事务中的多次的查询结果不一致.
数据库事务及隔离级别 - 图54步骤一:开启两个窗口A,B
数据库事务及隔离级别 - 图55步骤二:查看两个窗口的隔离级别:
数据库事务及隔离级别 - 图56select @@tx_isolation;
数据库事务及隔离级别 - 图57步骤三:设置A、B窗口的隔离级别为read committed
数据库事务及隔离级别 - 图58set session transaction isolation level read committed;
数据库事务及隔离级别 - 图59分别查看A,B两个窗口的隔离级别:
数据库事务及隔离级别 - 图60A窗口:read committed
数据库事务及隔离级别 - 图61B 窗 口 :read committed
步骤四:在两个窗口中分别开启事务:
数据库事务及隔离级别 - 图62start transaction;
数据库事务及隔离级别 - 图63步骤五:在B窗口进行转账操作:
数据库事务及隔离级别 - 图64update account set money = money - 1000 where name = ‘aaa’;
数据库事务及隔离级别 - 图65update account set money = money + 1000 where name = ‘bbb’;
没有提交事务!
数据库事务及隔离级别 - 图66步骤六:在A窗口进行查询:
数据库事务及隔离级别 - 图67数据根本没有变化!!!说明已经避免了脏读的发生.
数据库事务及隔离级别 - 图68步骤七:在B窗口提交事务:
commit;
数据库事务及隔离级别 - 图69步骤八:在A窗口查询:
数据库事务及隔离级别 - 图70发现数据已经发生变化!

06_演示解决不可重复读

数据库事务及隔离级别 - 图71步骤一:开启两个窗口A,B
数据库事务及隔离级别 - 图72步骤二:查看两个窗口的隔离级别:
select @@tx_isolation;
数据库事务及隔离级别 - 图73步骤三:设置A、B窗口的隔离级别为repeatable read
数据库事务及隔离级别 - 图74set session transaction isolation level repeatable read;
数据库事务及隔离级别 - 图75分别查看A,B两个窗口的隔离级别:
数据库事务及隔离级别 - 图76A窗口:repeatable read
数据库事务及隔离级别 - 图77B 窗 口 :repeatable read
步骤四:在两个窗口中分别开启事务:
数据库事务及隔离级别 - 图78start transaction;
数据库事务及隔离级别 - 图79步骤五:在B窗口完成转账的操作:
数据库事务及隔离级别 - 图80update account set money = money - 1000 where name = ‘aaa’;
数据库事务及隔离级别 - 图81update account set money = money + 1000 where name = ‘bbb’;
没有提交事务:
数据库事务及隔离级别 - 图82步骤六:在A窗口进行第一次查询:
数据没有变化!!! ——避免脏读.
数据库事务及隔离级别 - 图83步骤七:在B窗口中提交事务!
commit;
数据库事务及隔离级别 - 图84步骤八:在A窗口进行第二次查询:
数据库事务及隔离级别 - 图85数据还是没有变化的:避免不可重复读.
数据库事务及隔离级别 - 图86注意事项
数据库事务及隔离级别 - 图87只有当A窗口中的事务提交后,再到A窗口中查询才能看到B窗口提交的数据!

07_演示隔离级别为:serializable(避免脏读,不可重复读,幻读)

数据库事务及隔离级别 - 图88步骤一:开启两个窗口A,B
数据库事务及隔离级别 - 图89步骤二:查看两个窗口的隔离级别:
select @@tx_isolation;
数据库事务及隔离级别 - 图90步骤三:设置A窗口的隔离级别为serializable.
数据库事务及隔离级别 - 图91set session transaction isolation level serializable;
数据库事务及隔离级别 - 图92查看两个窗口的隔离级别:
数据库事务及隔离级别 - 图93A窗口 :serializable;
数据库事务及隔离级别 - 图94B窗口 :repeatable read;
步骤四:在两个窗口中分别开启事务:
数据库事务及隔离级别 - 图95start transaction;
数据库事务及隔离级别 - 图96步骤五:在B窗口插入记录:
数据库事务及隔离级别 - 图97insert into account values (null,’ddd’,10000);
数据库事务及隔离级别 - 图98没有提交事务
数据库事务及隔离级别 - 图99步骤六:在A窗口进行查询.
数据库事务及隔离级别 - 图100A窗口没有任何记录:

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539925453-1360dc7c-b730-4bef-9cca-d66681970367.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)A窗口的隔离级别:serializable:是串行的.一个事务没有结束.另一个事务不会执行的.(不存在事务的并发访问情况.)<br />![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539925208-3563aca6-d905-407a-90cd-b3a76d583e9b.png#align=left&display=inline&height=19&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=4&status=done&style=none&width=4)步骤七:在B窗口提交事务:<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608539925656-639451d3-2751-4c21-9174-23cd6b0862c1.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)A窗口中显示记录.