自学内容网 自学内容网

SQL事务

一.概述

什么是事务?事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作 作为一个整体一起向系统提交 或 撤销操作请求,即这些操作要么同时成功,要么同时失败。

二.事务的特征(ACID)

1.原子性

一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么 全部失败回滚,不可能只执行其中的一部分操作,这就是事务的原子性

2.一致性

数据库的数据总是从一个一致性的状态转换到另一个一致性的状态

3.隔离性

在执行一个事务时,此时该事务不能被其他事务干扰,对其他事务是不可见的

4.持久性

一旦事务提交,则其所做的修改会永久保存到数据库。

举个例子:a到银行给b转账500,此时转账这个事务要么转账成功要么失败,这就是体现了事务的原子性;而在转账的过程中,a转出去了500,b就必须收到500,保证数据的一致性,这就体现了事务的一致性;并且在a进行转账操作时,此时其他操作不能干扰a此时的转账操作,这就体现了事务的隔离性;而在转账完成后,此时对金额达到改变将永久保存进数据库中,这就体现了事务的持久性。

三.并发事务问题

1.脏读

一个事务读取到另一个事务未提交的数据

2.不可重复读

一个事务先后读取同一条数据,但是读取数据的结果不同,此时称之为不可重复读

3.幻读

一个事务照某种条件查询数据时,查询不到该数据,但是在插入数据时却又发现该数据已经存在,此时这种情况叫幻读

四.事务隔离级别

1.未提交读

允许事务读取其他事务未提交的数据,会引发脏读取、不可重复读和虚读,但避免了更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

2.已提交读(能解决脏读)

会引发不可重复读取和虚读,但避免脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

3.可重复读(mysql默认隔离级别)

确保事务可以多次从一个字段中读取相同的值,好比在事务开启时对现有的数据进行了拍照,其他事务对数据的修改,不管事务是否提交,我这里读取的是拍照下来的数据,可以避免脏读和不可重复读,但幻读的问题仍然存在。注意:INNODB使用了MVCC(MultiversionConcurrencyControl),即多版本并发控制技术防止幻读。真正的像拍照一样,其他事务新插入或删除的记录也看不出来。

能解决脏读、不可重复读,一般会用这个隔离级别

4.串行化

提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行,性能十分低下。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

上述三种问题都能解决,但是效率低

注:这个隔离级别是从上往下隔离级别也越高,但隔离级别越高,性能也就越低


原文地址:https://blog.csdn.net/Heartoxx/article/details/140233796

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!