2019独角兽企业重金招聘Python工程师标准>>>
此章带大家回顾下本地事物的一些内容。标题 2
事物:
有一组操作构成的可靠,独立的工作单元----百度百科
事物的四大特性:
A:原子性(Atomicity)事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。 B:一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 C:隔离性(Isolation)一个事务的执行不能被其他事务干扰。 D:持续性/永久性(Durability)一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
以上介绍完事务的四大特性(简称ACID),现在重点来说明下事务的隔离性,当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题:
不可重复读
不可重复读的重点是修改:
同样的条件, 你读取过的数据, 再次读取出来发现值不一样了
例子:
在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
con1 = getConnection();
select salary from employee empId ="Mary";
在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.
con2 = getConnection();
update employee set salary = 2000;
con2.commit();
在事务1中,Mary 再次读取自己的工资时,工资变为了2000
//con1
select salary from employee empId ="Mary";
在一个事务中前后两次读取的结果并不致,导致了不可重复读。
幻读
幻读的重点在于新增或者删除
同样的条件, 第1次和第2次读出来的记录数不一样
例子:
目前工资为1000的员工有10人。
事务1,读取所有工资为1000的员工。
con1 = getConnection();
Select * from employee where salary =1000;
共读取10条记录
这时另一个事务向employee表插入了一条员工记录,工资也为1000
con2 = getConnection();
Insert into employee(empId,salary) values("Lili",1000);
con2.commit();
事务1再次读取所有工资为1000的员工
//con1
select * from employee where salary =1000;
共读取到了11条记录,这就产生了幻像读。
事物的隔离级别:
现在来看看MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。
在MySQL数据库中查看当前事务的隔离级别:
select @@tx_isolation;
在MySQL数据库中设置事务的隔离 级别:
set [glogal | session] transaction isolation level 隔离级别名称;set tx_isolation=’隔离级别名称;’
本地事物的局限性:
如何修复事物的局限性解决微服务问题?
1:单数据源局限性思考
既然一个事物只能操作一个数据源,那么我们能否新建多个事物,分别操作多个数据源,最后通过一个统一的”事物管理器”进行统一管理以及提交呢?
2:单进程局限性思考
既然一个事物只能对一个线程进行管理,那么我们能否新建多个事物,分别操作多个线程,最后通过一个统一的”事物管理器”进行统一管理以及提交呢?
3:高并发下效率低局限性思考
既然事物执行效率低,那么能否把事物的执行丢到一个异步线程里面执行,这样主线程就不会受事物的影响了。
那就带着,我们自己思考的解决方案,正式进入分布式方案的讲解吧。
/**
* ————————如果觉得本博文还行,别忘了推荐一下哦,谢谢!
* 作者:写程序的奥特曼
* 欢迎转载,请保留此段声明。
* 出处:https://my.oschina.net/u/2286631/blog/1504647
*/