A8站源码交易平台
基本概念
· 和业务相关的句子只要DML句子(insert delete update)
· 业务是逻辑上的一组操作,要么都履行,要么都不履行
· 最经典的转账事例:小明给小红转账1000元。其中就涉及两个关键操作:小明余额减少1000元,小红余额添加1000元,业务便是要确保二者一起成功或失败
业务的四大特性 (ACID)
原子性(Atomicity): 业务是最小的履行单位,不答应分割
一致性(Consistency): 业务必须确保多条DML句子一起成功或一起失败
阻隔性(Isolation): 各个业务的履行互不干扰,并发履行的业务不会互相影响
持久性(Durability): 一个业务被提交之后。它对数据库中数据的改变是持久的,即便数据库发生毛病也不应该对其有任何影响。
业务的阻隔等级
第一等级: 读未提交(Read Uncommitted)
最低的阻隔等级,答应读取没有提交的数据改变
可能会导致脏读、幻读或不可重复读
第二等级: 读已提交(Read Committed) (Oracle默许的阻隔等级)
答应读取并发业务已经提交的数据
可以阻挠脏读, 但是幻读或不可重复读仍有可能发生
第三等级: 可重复读(Repeateable Read) (MySQL默许的阻隔等级)
对同一字段的屡次读取成果都是一致的,除非数据是被自身业务自己所修改
可以阻挠脏读和不可重复读,但幻读仍有可能发生
第四等级: 序列化读/串行化读(Serializable)
最高的阻隔等级,完全遵守ACID的阻隔等级。所有的业务顺次逐一履行,这样业务之间就完全不可能产生干扰。
可以防止脏读、不可重复读以及幻读。A8站源码交易平台
问题:功率低,业务需求排队履行
并发业务带来的问题
脏读(Dirty Read): 当一个业务正在拜访数据而且对数据进行了修改,而这种修改还没有提交到数据库中,这时别的一个业务也拜访了这个数据,然后运用了这个数据。因为这个数据是还没有提交的数据,那么别的一个业务读到的这个数据是 “脏数据” ,根据 “脏数据” 所做的操作可能是不正确的
不可重复读(Unrepeatable Read): 指在一个业务内屡次读同一数据。在这个业务还没有结束时,另一个业务也拜访该数据。那么,在第一个业务中的两次读数据之间,由于第二个业务的修改导致第一个业务两次读取的数据可能不相同。这就发生了在一个业务内两次读到的数据是不一样的情况,因而称为不可重复读。
幻读(Phantom Read): 幻读与不可重复读相似。它发生在一个业务(T1) 读取了几行数据,接着另一个并发业务(T2) 插入了一些数据时。在随后的查询中,第一个业务(T1) 就会发现多了一些原本不存在的记载,就好像发生了幻觉一样,所以称为幻读。
注意:
不可重复读和幻读的差异:
· 不可重复读的要点是修改比方屡次读取一条记载发现其中某些列的值被修改
· 幻读的要点在于新增或者删去比方屡次读取一条记载发现记载增多或减少了。
A8站源码交易平台--业务操控
MySQL支持业务主动提交
运用begin 或 start transaction封闭主动提交机制,开启业务
rollback 回滚
commit 提交业务
设置、检查业务的大局阻隔等级
例: set global transaction isolation level Serializable; 设置阻隔等级为串行化读
select @@global.transaction_isolation; 检查阻隔等级
A8站源码交易平台