SQL事务

什么是事务

事务是进行一次处理的基本单位,要么完全执行,要么都不执行。

事务与进程、线程一样都是执行者。在DBMS中,事务是由查询和更新语句的序列组成执行单元。

事务的特性:ACID

1. A,也就是原子性(Atomicity)。原子的概念就是不可分割,你可以把它理解为组成物质的基本单位,也是我们进行数据处理操作的基本单位。

2. C,就是一致性(Consistency)。一致性指的就是数据库在进行事务操作后,会由原来的一致状态,变成另一种一致的状态。也就是说当事务提交后,或者当事务发生回滚后,数据库的完整性约束不能被破坏。

3. I,就是隔离性(Isolation)。它指的是每个事务都是彼此独立的,不会受到其他事务的执行影响。也就是说一个事务在提交之前,对其他事务都是不可见的。

4. D,指的是持久性(Durability)。事务提交之后对数据的修改是持久性的,即使在系统出故障的情况下,比如系统崩溃或者存储介质发生故障,数据的修改依然是有效的。因为当事务完成,数据库的日志就会被更新,这时可以通过日志,让系统恢复到最后一次成功的更新状态。

在这四个特性中,原子性是基础,隔离性是手段,一致性是约束条件,而持久性是我们的目的。

事务的控制

MySQL 中,InnoDB 是支持事务的,而 MyISAM 存储引擎不支持事务。Oracle 是支持事务的。

事务的控制语句:

1. START TRANSACTION 或者 BEGIN ,开启一个显式事务。

2. COMMIT:提交事务。当提交事务后,对数据库的修改是永久性的。

3. ROLLBACK 或者 ROLLBACK TO [SAVEPOINT],意为回滚事务。意思是撤销正在进行的所有没有提交的修改,或者将事务回滚到某个保存点。

4. SAVEPOINT:在事务中创建保存点,方便后续针对保存点进行回滚。一个事务中可以存在多个保存点。

5. RELEASE SAVEPOINT:删除某个保存点。

6. SET TRANSACTION,设置事务的隔离级别。

事务有两种方式,分别为隐式事务和显式事务;START TRANSACTION 或者 BEGIN ,开启的是显式事务。隐式事务会自动提交。

回滚只能够影响当前事务,已经提交的事务就无法进行影响了。

事务保证了当我们想要执行一个或者一套动作的时候,要么就在不影响数据一致性、满足数据定义的要求的情况下一整套地完整地操作下来,要么就一点都不修改数据。

事务并发异常处理

事务的异常处理:脏读、不可重复读、幻读。

脏读:读到了其他事务还没有提交(没有commit,真实物理介质中的内容不会有变化,但是内存里已经有了)的数据。

不可重复读:对某数据进行读取,发现两次读取的结果不同,也就是说没有读到相同的内容。这是因为有其他事务对这个数据同时进行了修改或删除。

幻读:事务 A 根据条件查询得到了 N 条数据,但此时事务 B 更改或者增加了 M 条符合事务 A 查询条件的数据,这样当事务 A 再次进行查询的时候发现会有 N+M 条数据,产生了幻读。

不可重复读和幻读的区别:
不可重复读是同一条记录的内容被修改了,重点在于UPDATE或DELETE
幻读是查询某一个范围的数据行变多了或者少了,重点在于INSERT

事务的隔离级别

脏读、不可重复读和幻读这三种异常情况,是在 SQL-92 标准中定义的,同时 SQL-92 标准还定义了 4 种隔离级别来解决这些异常情况,这四种隔离级别从低到高分别是:

读未提交

读已提交

可重复读

可串行化

读未提交,也就是允许读到未提交的数据,这种情况下查询是不会使用锁的,可能会产生脏读、不可重复读、幻读等情况。

读已提交就是只能读到已经提交的内容,可以避免脏读的产生,属于 RDBMS 中常见的默认隔离级别(比如说 Oracle 和 SQL Server),但如果想要避免不可重复读或者幻读,就需要我们在 SQL 查询的时候编写带加锁的 SQL 语句。

可重复读,保证一个事务在相同查询条件下两次查询得到的数据结果是一致的,可以避免不可重复读和脏读,但无法避免幻读。MySQL 默认的隔离级别就是可重复读。

可串行化,将事务进行串行化,也就是在一个队列中按照顺序执行,可串行化是最高级别的隔离等级,可以解决事务读取中所有可能出现的异常情况,但是它牺牲了系统的并发性。

随着隔离级别的提高,锁的粒度也在不断增加。

隔离级别越低,意味着系统吞吐量(并发程度)越大,但同时也意味着出现异常问题的可能性会更大。在实际使用过程中我们往往需要在性能和正确性上进行权衡和取舍。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值