本地事物的简介

此章带你们回顾下本地事物的一些内容。标题 2java

事物:

有一组操做构成的可靠,独立的工做单元----百度百科数据库

事物的四大特性:

A:原子性(Atomicity)
       事务是数据库的逻辑工做单位,事务中包括的诸操做要么全作,要么全不作。
B:一致性(Consistency)
       事务执行的结果必须是使数据库从一个一致性状态变到另外一个一致性状态。一致性与原子性是密切相关的。
C:隔离性(Isolation)
      一个事务的执行不能被其余事务干扰。
D:持续性/永久性(Durability)
      一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

以上介绍完事务的四大特性(简称ACID),如今重点来讲明下事务的隔离性,当多个线程都开启事务操做数据库中的数据时,数据库系统要能进行隔离操做,以保证各个线程获取数据的准确性,在介绍数据库提供的各类隔离级别以前,咱们先看看若是不考虑事务的隔离性,会发生的几种问题:session

不可重复读多线程

不可重复读的重点是修改:并发

一样的条件, 你读取过的数据, 再次读取出来发现值不同了异步

例子:分布式

在事务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 spa

//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 */

相关文章
相关标签/搜索