数据库事务机制
介绍
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;
例如:火车售票,一个车座的票已经占用了,别人正在购票站位,显示购票失败,这时候就需要读取未提交的数据
演示:
原表数据
不修改事务级别
查询是否能够读取到我们修改未提交的数据
答案是肯定读取不到的
加上修改事务的隔离级别
可以获取到我们修改未提交的数据
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;
他会一直等待前一个事务执行成功,有点像队列一样(个人理解)
评论区