[MySQL] ACID
Posted immjc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[MySQL] ACID相关的知识,希望对你有一定的参考价值。
1. 事务
它是一个操作序列,这些操作要么都执行,要么都不执行。它是一个不可分割的工作单位。
2. ACID
事务具有四个特性:原子性,一致性,隔离性,持久性。
原子性
指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
数据库管理系统默认情况下一条SQL就是一个单独的事务,事务是自动提交的。只有显示使用start transaction开启一个事务,才能将一个代码块放在事务中执行,保障事务的原子性是数据块的基本责任,因此许多数据库采用日志机制。使用一个预写事务日志,将数据提交到实际数据页面之前,先写在事务日志上。
一致性
指事务开始之前和事务结束之后 ,数据库的完整性约束没有被破坏,这就是说数据库事务不能破坏关系数据的完整性以及业务逻辑的一致性。也就是对数据库中数据操作实现守恒。
解决办法:1. 数据库机制层面:在事务执行前后,数据会符合设置的约束(外键约束,唯一约束,check约束等)和触发器设置。2. 业务层面:由开发人员保证,也可以通过数据库层面来实现
隔离性
多个事务并发访问时,事务之间时隔离的,一个事务不应该影响其他事务的运行效果。在并发环境中,当不同的事务同时操作相同的数据时,每个事务都有各自的完整数据空间,由并发事务所做的修改必须与任何其他并发事务所做的修改隔离,事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一个事务修改它之后的状态,事务不会查看到中间状态的数据。
解决办法:数据库通过加锁和阻塞来保证事务之间不同等级的隔离性。一般情况下,完全的隔离是不现实的。同一时间只执行一条事务。严重影响性能。
并发事件间的干扰:
1. 事务之间的相互影响:脏读、不可重复读、幻读、丢失更新
2. 理解数据库中的隔离等级:未提交读、已提交读(默认)、可重复读、可串行度。在多用户多进程多线程的并发系统中,保证数据的一致性和完整性。高的隔离等级意味着更多的锁,影响性能。
隔离事务之间的影响通过锁来实现,通过阻塞来阻止上述的影响。不同的隔离级别是通过不同的锁造成阻塞来实现。
持久性
意味着事务完成之后,该事务对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。事务一旦提交,就永久存在数据库中。
解决办法:通过write-ahead transaction log来保证持久性。即事务中对数据库的改变在写入数据库之前,首先写入事务日志中。而事务日志是按照顺序排号的LSN,当数据库奔溃或服务器断电时重启数据库首先会检查日志顺序号,将本该数据库更改而未做的部分持久化到数据库,保证持久性。
总结
事务的ACID特性是关系型数据库系统来实现的,数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。
数据库管理系统通过锁机制来实现事务的隔离性,当多个事务同时更新数据时,只允许持有锁的事务更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。
以上是关于[MySQL] ACID的主要内容,如果未能解决你的问题,请参考以下文章