事务是操作数据库中某个数据项的一个程序执行单元。具有4个属性:原子性、一致性、隔离性、持久性。
事务中包含的各项操作在一次执行过程中,要么全部执行成功,要么全部不执行。
事务在执行之前和之后,数据都必须保证一致性。
在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其他事务干扰。即不同的事务并发操纵相同的数据时,每个事务都有各自完整的数据空间,并发执行的各个事务之间不能相互干扰。
一个事务一旦提交,它对数据库中数据的状态变更就应该是永久性的。
脏读: 一个事务正访问数据并对数据进行修改,此时另外一个事务也访问了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”。
不可重复读: 一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况。
幻读:一个事务(a)读取了几行数据,另一个并发事务(b)插入了一些数据。在随后的查询中,第一个事务(a)就会发现多了一些原本不存在的记录。
READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
SERIALIZABLE(串行化): 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行。
MySQL中默认存储引擎为InnoDB,InnoDB是通过日志和锁来保证的事务的ACID特性,具体如下:
(1)通过数据库锁的机制,保障事务的隔离性;
(2)通过Redo Log来,保障事务的持久性;
(3)通过Undo Log来,保障事务的原子性;
(4)通过Undo Log来,保障事务的一致性;
对于分布式系统,需要保证分布式系统中的数据一致性。分布式系统中对数要么一起成功,要么一起失败,必须是一个整体性的事务。分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
微服务应用场景:跨库事务、分库分表、微服务化。
一致性:多个副本之间能否保持一致的特性
可用性:系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。
分区容错性 :即使出现单个组件无法可用,操作依然可以完成
分布式系统中,一个Web应用至多只能同时支持上面的两个属性,需要在一致性与可用性之间做出选择。
来源:尼恩老哥