Day06_事务

一、事务

在这里插入图片描述
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.幻读演示

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BlackTurn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值