wordpress 网站上传到服务器,网站语言包是什么,网站推广专业术语,万网域名的查询方式一、事务事务是数据库管理系统执行过程中的一个逻辑单位#xff0c;由一个有限的数据库操作序列构成。--摘自百科在MySQL里#xff0c;事务是在引擎层面实现#xff0c;比如MyIsam不支持#xff0c;InnoDB支持面试清单#xff08;Java岗#xff09;#xff1a;JavaJVM数…一、事务事务是数据库管理系统执行过程中的一个逻辑单位由一个有限的数据库操作序列构成。--摘自百科在MySQL里事务是在引擎层面实现比如MyIsam不支持InnoDB支持面试清单Java岗JavaJVM数据库算法Spring中间件设计模式shimo.im二、ACID提到事务肯定会想到 ACID 是吧自行感受一下概念然后我们来讲讲隔离性的问题。原子性事务的所有操作要么全部成功要么全部回滚。一致性总是从一个一致性的状态转换到另一个一致性的状态。隔离性多个事务并发执行时一个事务的执行不应影响其他事务的执行持久性已被提交的事务对数据库的修改应该永久保存在数据库中。三、隔离级别做了多年的 CRUDer对这几个词真是不陌生要不是出去面试也真不会去了解。希望大家看完之后面试的时候不要慌跟他刚。实际上这些场景都是出现在多个事务同时执行时的场景。3.1 脏读Read Uncommitted通俗的讲一个事务在处理过程中读取了另外一个事务未提交的数据。你都还没提交我就读到了你刚操作的数据万一你回滚了怎么办你说这脏不脏。举例假设打赏的逻辑是① 我的账户1元② 你的账户-1元。当你执行到第一个步骤我去查询我的账户已经是2元了很开心宣布请大家去撸串但是最后扣款的时候发现你余额不足了回滚了我的1元没了就很难受3.2 不可重复读Non-repeatable Read通俗的讲一个事务范围内多次查询某个数据却得到不同的结果。与脏读的区别脏读是读到未提交的数据而不可重复读读到的却是已经提交的数据但实际上是违反了事务的一致性原则。举例假设我查了下账户余额看到你们给小编打赏了1块钱很开心宣布请大家去撸串在付款之前钱被另外一个人取走又查询到没钱了被留下来洗碗了因为我查询完后这条数据没锁住又被别的事务更新了导致当前事务每次都是读到最新的数据。3.3 幻读在Repeatable Read隔离级别下一个事务可能会遇到幻读Phantom Read的问题。事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集然后再提交。举例看到了吗在一个事务A中第一次查询某条记录是没有的但是当试图更新这条不存在的记录时竟然能成功并且再次读取同一条记录它就神奇地出现了。实际上在InnoDB引擎中对于索引的扫描不仅锁住扫描到的索引而且还锁住这些索引覆盖的范围gap因此这个范围是内插入数据是不允许的。四、mysql模拟事务隔离性测试SELECT session.tx_isolation;
SELECT tx_isolation; SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;
SET SESSION TRANSACTION ISOLATION LEVEL read committed;
SET SESSION TRANSACTION ISOLATION LEVEL repeatable read;
SET SESSION TRANSACTION ISOLATION LEVEL serializable; start transaction;--建表
drop table AMOUNT;
CREATE TABLE AMOUNT (
id varchar(10) NULL,
money numeric NULL
)
;
--插入数据
insert into amount(id,money) values(A, 800);
insert into amount(id,money) values(B, 200);
insert into amount(id,money) values(C, 1000);
--测试可重复读插入数据
insert into amount(id,money) values(D, 1000);--设置事务
SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;
SELECT tx_isolation;
--开启事务
start transaction;--脏读演示读到其他事务未提交的数据
--案列1事务一A向B转200事务二查看B金额变化事务一回滚事务
update amount set money money - 200 where id A;
update amount set money money 200 where id B;--不可重复读演示读到了其他事务提交的数据
--案列2事务一B向A转200事务二B向C转200转100
SET SESSION TRANSACTION ISOLATION LEVEL read committed; --开启事务
start transaction;
--两个事务都查一下数据(转账之前需要查一下金额是否够满足转账)
select * from amount;
--事务一B向A转200
update amount set money money - 200 where id B;
update amount set money money 200 where id A;commit;
--事务二B向C转200转100
update amount set money money - 100 where id B;
update amount set money money 100 where id C;
commit;
--从事务二的角度来看读到了事务一提交事务的数据导致金额出现负数--幻读演示
--案列3事务一B向A转200事务二B向C转200转100
SET SESSION TRANSACTION ISOLATION LEVEL repeatable read; --开启事务
start transaction;
--两个事务都查一下数据(转账之前需要查一下金额是否够满足转账)
select * from amount;
--事务一B向A转200
update amount set money money - 200 where id B;
update amount set money money 200 where id A;commit;
--事务二B向C转200转100
update amount set money money - 100 where id B;
update amount set money money 100 where id C;
commit;
--从事务二的角度来看读到了事务一提交事务的数据导致金额出现负数作者Java2B原文链接https://juejin.im/post/5e1417006fb9a047f3363c41