一、事务

1.事务的介绍
1. 事务的基本介绍
概念:
* 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
操作:
1. 开启事务: start transaction;
2. 回滚:rollback;
3. 提交:commit;
举例:
CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
);
-- 添加数据
INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);
SELECT * FROM account;
UPDATE account SET balance = 1000;
-- 张三给李四转账 500 元
-- 0. 开启事务
START TRANSACTION;
-- 1. 张三账户 -500
UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
-- 2. 李四账户 +500
UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';
-- 发现执行没有问题,提交事务
COMMIT;
-- 发现出问题了,回滚事务
ROLLBACK;

2.事务提交的两种方式:
* 事务提交的两种方式:
* 自动提交:
* 一条DML(也就是每进行一次增删改操作)语句会自动提交一次事务。
你平时一直都在使用自动提交啊,你想想你每次update一次数据,你再查看时就发现数据发生变化了,这就是因为自动提交。
* 手动提交:
* 需要先开启事务,再提交
(也就是说,只要你有START TRANSACTION;语句,就会认为你开启手动提交模式了,那么如果没有COMMIT;语句就不会提交,当你重启数据库就发现数据其实没有更新)
3.修改默认提交方式:
* mysql默认自动提交的,Oracle 数据库默认是手动提交事务
* 查看事务的默认提交方式:SELECT @@autocommit;
-- 输出结果要是1 代表自动提交 0 代表手动提交
* 修改默认提交方式: set @@autocommit = 0;

4.事务的四大特征(面试必问)
原子性:下订单、减库存、扣积分这三个要么同时成功要么同时失败,这就是原子性。原子性就是一系列操做不可拆分,同成同败。
一致性:A给B转200,转完帐必须保证A和B的总额没有变,不能一方扣减另一方没有增加
隔离性:事物之间互相隔离,100个人同时下单,一个人下单失败,不能影响其他人。
持久性:一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。–即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态
事务的四大特征:
1. 原子性(atomicity):一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性。
2. 一致性(consistency):事务操作前后,数据总量不变。如果数据库系统在运行过程中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所作的修改有一部分已写入物理数据库,这是数据库就处于一种不正确的状态,也就是不一致的状态
3. 隔离性(isolation):多个事务之间相互独立。对应着事务的四种隔离级别
4. 持久性(durability):一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。
事物的隔离性
事务的隔离级别(了解)
* 概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
* 存在问题:
1. 脏读:一个事务,读取到另一个事务中没有提交的数据
2. 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。
3. 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
* 隔离级别:
1. read uncommitted:读未提交
* 产生的问题:脏读、不可重复读、幻读
2. read committed:读已提交 (Oracle)
* 产生的问题:不可重复读、幻读
3. repeatable read:可重复读 (MySQL默认)
* 产生的问题:幻读
4. serializable:串行化
* 可以解决所有的问题
* 注意:隔离级别从小到大安全性越来越高,但是效率越来越低
* 数据库查询隔离级别:
* select @@tx_isolation;
* 数据库设置隔离级别:
* set global transaction isolation level 级别字符串;
* 事务的隔离级别最好不要随便改动,mysql和oracle都使用默认的最好

二、演示
1.脏读演示




2.不可重复读演示



3.幻读演示




958

被折叠的 条评论
为什么被折叠?



