侧边栏壁纸
博主头像
Epoch

Java开发、Python爬虫、微服务、分布式、前端

  • 累计撰写 92 篇文章
  • 累计创建 109 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

数据库事务机制

Epoch
2021-02-03 / 0 评论 / 0 点赞 / 242 阅读 / 836 字 / 正在检测是否收录...

数据库事务机制

介绍

Mysql5+后支持事务

1.避免写入直接操作数据文件

2.利用日志来实现间接写入

MySQL一共有五种日志,其中只有redo日志和undo日志与事务有关

事务机制

1.RDBMS = SQL语句 + 事务(ACID)

2.事务是一个或者多个SQL语句组成的整体,要么全部执行成功,要么全部执行失败

例如:

START TRANSACTION;

DELETE FROM sys_menu;
DELETE FROM sys_role;
SELECT * FROM sys_menu;
SELECT * FROM sys_role;
-- ROLLBACK; 回滚
-- COMMIT; 事务提交,redo和数据库文件同步
COMMIT;

事务的原子性

一个事务中所有的操作要么全部完成,要么全部失败。事务执行后,不允许停留在中间某个状态

事务的一致性

不管在任何给定的时间、并发事务有多少,事务必须保证运行结果的一致性

事务的隔离性

隔离性要求事务不受其他并发事务的影响,如同在给定的时间内,该事务是数据库唯一运行的事务

事务的持久性

事务一旦提交,结果便是永久性的,即便发生了宕机,任然可以考事务日志完成数据的持久化

事务四个隔离级别

序号 隔离级别 功能
1 read uncommitted 读取未提交数据
2 read committed 读取已提交数据
3 repeatable read 重复读取
4 serializable 序列化

1.修改事务隔离级别

READ UNCOMMITTED 代表可以读取其他事务为提交的数据

下面语句只是临时设置,只在当前会话窗口中生效。

SET SESSION TRANSACTION ISOLATION LEVEL
READ UNCOMMITTED;

例如:火车售票,一个车座的票已经占用了,别人正在购票站位,显示购票失败,这时候就需要读取未提交的数据

演示:

原表数据

image-20210203150801755.png

不修改事务级别

image-20210203150837329.png

查询是否能够读取到我们修改未提交的数据

image-20210203150908451.png

答案是肯定读取不到的

加上修改事务的隔离级别
image-20210203151015951.png

可以获取到我们修改未提交的数据

2.修改事务隔离级别

READ COMMITTED 代表只能读取其他事务提交的数据

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

例如银行转账,需要读取提交后的数据

3.修改事务隔离级别

REPEATABLE READ 代表事务在执行中反复读取数据,得到的结果是一致的,不会受到其他事务影响

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

例如:商家在对商品涨价的时候,用户正在给商品下单购买,这时候需要用户以涨价钱的价格支付,就需要用到这个

***这个REPEATABLE READ就是数据库的默认隔离级别***

4.事务的序列化

由于事务并发执行所带来的的各种问题,前三种隔离级别只适用在某些业务场景中,但是序列化的隔离性,让事务逐一执行,就不会产生上述问题了。

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

他会一直等待前一个事务执行成功,有点像队列一样(个人理解)

0

评论区