事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;
事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
事务完成后,它对数据的修改是永久性的,即使出现系统故障也能够保持。持久性一般通过数据库备份和恢复来保证。
对于同时运行的多个事务,当这些事务访问数据库的相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发的问题,这些并发问题可以归纳为以下几类:
一个事务正在对一个记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做“脏读”。
不可重复读的重点在修改,比如多次读取一条记录发现其中某些列的值被修改。
幻读的重点在于新增或删除,比如多次读取一个范围的记录,发现记录增多或减少了。
锁机制能有效的解决各种并发问题,但是他会影响并发性能,并发性能是指数据库系统同时为各种客户提供服务的能力。当一个事务锁定资源时,其他事务必须停下来等待,这就降低了数据库系统同时响应各种客户程序的速度。
数据库系统为用户提供了四种事务隔离级别供用户选择:
未提交读中一个事务能够读取到别的事务没有提交的更新数据。这种级别很有可能读到脏数据,隔离级别最低。
已提交读限制了一个事务只能读取别的事务提交的更新数据。解决了脏读的问题,但未解决不可重复读的问题。oracle默认这种级别
可重复读保证了同一事务中先后执行的多次查询将返回同一结果,不受其他事务的影响。但这种隔离级别可能出现幻读。MySQL默认这种级别
可序列化不允许事务并发执行,强制事务串行执行,就是在读取的每一行数据上都加上了锁,读写都会堵塞。这种隔离级别最高,最安全,不会出现脏读,不可重复读,幻读,丢失更新的问题,但是性能最低。
参考文章:
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:数据库开发、优化与管理维护(第二版)