数据库-事务管理详解

为什么要引入事务管理

举个例子:显示生活中我们经常有多个用户访问修改同一段数据的现象比如超卖,就是大家看这个物品还有1个货,都买的。但实际只有一个,卖的大于货的数量。火车票啊,网购啊,演出座位啊,这些出现这种显示都是很可怕的。所以数据库引入事务管理来避免这种事情的发生。

什么是事务

事务就是一组DML(数据操作语句)组成的整体。在使用过程中,这组语句的操作是一个整体,要么一起成功,要么一起失败的原子操作。
注意:MyISAM不支持事务,InnoDB支持事务。所以MyISAM的每一步操作都直接提交了。

事务的特性(ACID)

原子性
一致性
隔离性
持久性

事务的使用

1.开始一个事务
start transaction;
2.创建一个保存点
savepoint 保存点名;
3.回到保存点(根据具体情况)
rollback to 保存点名;
4.提交
commit;
在我们操作之间开启一个事务start transaction;如果我们不创建保存点直接返回保存点rollback to ;。就回到开始事务的地方。我们在执行危险操作前,应该创建一个保存点savepoint 保存点名;这样我们如果发生错误,可以回到保存点rollback to 保存点名;当我们确保了我们的操作结束后,我们输入commit ;提交。在这之前,我们执行的操作实际上都是在内存中缓存着的并没有提交,当我们输入commit;才一起提交给数据库。提交后,就无法再完成回滚了。数据就真的被改动了。

事务的隔离级别

mysql提供一种机制,可以让多线程的不同事务在操作的时候具有隔离性。来保证数据的一致性。
事务一共有四种隔离级别:读未提交 读已提交 可重复读 可串行化
事务可能会产生几种现象。
1.脏读 :(读到错误未提交数据)当一个事务A修改了数据,未提交给数据库的时候,另一个事务B访问到了这个数据。
2.不可重复读:(读两次数据内容不一致)当一个事务A读取了数据后,事务B修改了该数据,事务A再次读取数据和同一次不一致。
3.幻读:(读取同一段数据数量不一致)当一个事务A读取了一行数据后,数据B添加了一条数据,事务A再次读取数据量发生了改变。
在这里插入图片描述
数据隔离级别越高,就是加锁的行为,响应的性能、处理效率就会降低。所以现在的大数据很多都不满足隔离要求。都存在脏读线程。
注意:
Innodb 利用MVCC多版本并发控制的技术,避免了幻读,还不用加锁,但是属于可重复读级别。Innodb不存是事情发生的实际实现,而是存储事情发生的版本号。实现允许非阻塞式读,在写操作进行时只锁定必要的记录,也就是添加了一个这个写操作的版本号。在同一事务中只同一版本的数据。

如何设置事务的隔离级别

set session transaction isolation level 【级别】;
例子:set session transaction isolation level read uncommitted;//读未提交级别
读未提交:read uncommited
读已提交:read commited
可重复度:repeatable read
可串行化:serializable

查看隔离界别
通过 select @@tx_isolation;

©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页