1、事务的四个特性, 简称ACID属性
原子性(Atomicity):由DBMS的事务管理子系统来实现
事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
一致性(Consistent):由DBMS的完整性子系统执行测试任务
在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;
事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
隔离性(Isolation)由DBMS的并发控制子系统实现
数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
持久性(Durable):由DBMS的恢复管理子系统实现
事务完成后,它对数据的修改是永久性的,即使出现系统故障也能够保持。持久性一般通过数据库备份和恢复来保证。
2、多个事务并发运行时的并发问题
对于同时运行的多个事务,当这些事务访问数据库的相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发的问题,这些并发问题可以归纳为以下几类:
1、更新丢失(Lost Update):撤销一个事务时,把其他事务提交的更新数据覆盖
2、覆盖更新(Overwrite Update): 一个事务覆盖另一个事务已提交的更新数据
3、脏读(Dirty Reads):一个数据读到另一个事务未提交的更新数据
一个事务正在对一个记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做“脏读”。
4、不可重复读(Non-Repeatable Reads):一个事务读取到另一个事务已提交的更新数据,即一个事务两次读取同一个数据,两次读取的数据不一致。
5、幻读(Phantom Reads):一个事务读到另一个事务已提交的新插入数据,即一个事务两次读取一个范围的记录,两次读取的数据不一致。
不可重复读和幻读的区别:
不可重复读的重点在修改,比如多次读取一条记录发现其中某些列的值被修改。
幻读的重点在于新增或删除,比如多次读取一个范围的记录,发现记录增多或减少了。
3、数据库的事务隔离级别
锁机制能有效的解决各种并发问题,但是他会影响并发性能,并发性能是指数据库系统同时为各种客户提供服务的能力。当一个事务锁定资源时,其他事务必须停下来等待,这就降低了数据库系统同时响应各种客户程序的速度。
数据库系统为用户提供了四种事务隔离级别供用户选择:
1、未提交读(Read Uncommitted):一个事务在执行过程总可以看到其他事务没有提交的新插入的数据,而且能看到其他事务没有提交对已有记录的更新。
未提交读中一个事务能够读取到别的事务没有提交的更新数据。这种级别很有可能读到脏数据,隔离级别最低。
2、已提交读(Read Committed):一个事务在执行过程中可以看到其他事务已经提交的新插入的数据,而且能看到其他事务已经提交对已有记录的更新。
已提交读限制了一个事务只能读取别的事务提交的更新数据。解决了脏读的问题,但未解决不可重复读的问题。oracle默认这种级别
3、可重复读(Repeated Read):一个事务在执行过程中可以看到事务已经提交的新插入的记录,但是不能看到其他事务对已有记录的更新。
可重复读保证了同一事务中先后执行的多次查询将返回同一结果,不受其他事务的影响。但这种隔离级别可能出现幻读。MySQL默认这种级别
4、可序列化(Serializable):一个事务在执行的过程中国完全看不到其他事务对数据所做的更新,当两个事务同时操作数据库时,如果第一个事务已经在访问该数据,第二个事务只能停下来等待,必须等到第一个事务结束后才能恢复运行。
可序列化不允许事务并发执行,强制事务串行执行,就是在读取的每一行数据上都加上了锁,读写都会堵塞。这种隔离级别最高,最安全,不会出现脏读,不可重复读,幻读,丢失更新的问题,但是性能最低。
参考文章:
1、https://www.nowcoder.com/questionTerminal/3a2440c414e94cdb8e5fe57103afd20d
2、https://blog.csdn.net/qq_36387683/article/details/106516985
3、https://www.nowcoder.com/questionTerminal/d48059795dc14c3e87a9ccc526aa6bdf
4、https://blog.csdn.net/langzixiake1131/article/details/5719976
5、深入浅出MySQL:数据库开发、优化与管理维护(第二版)