一 什么是事务
1)一组逻辑操作单元,使数据从一种状态变换到另一种状态。
2)数据库事务由以下部分组成
2)一致性(Consistency)
- 事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态
3)隔离性(Isolation)
- 并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样
4)持久性(Durability)
- transaction1 将某个记录的age 从 20 改成 30
- transaction2 读取了 transaction1 更新后的值:30
- transaction1回滚,age值 恢复到了 20
- transaction2 读取的age=30 是一个无效的值
2)不可重复读
- transaction1 读取到age 的值 20
- transaction2 将 age 的值 修改为了 30
- transaction1 再次读取age 的值 为 30,和第一次读取的不一致
3)幻读
- transaction1 读取了 student 表的一部分数据
- transaction2 向 student 表 插入新的行
- transaction1 再次读取student 的时候,多出了一些行
4)更新丢失
- transaction1 在更新提交age 从20 变为 30
- transaction2 也在更新提交 age + 5的操作,但是,最终 age 提交为 25
四 事务的隔离级别
4.1 概述
1)数据库系统必须具有隔离并发允许各个事务的能力,使它们不会互相影响,避免出现并发问题。
2)一个事务与其他事务隔离的程度被称之为事务的隔离级别。
3)SQL标准中规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越好,数据的一致性越好,但是并发能力越弱。4.2 各种隔离级别
(1)读未提交**:read uncommitted**
- 允许transaction1 读取 transaction2 未提交的修改
(2)读已提交**:read committed**
- 要求transaction1 只能读取 transaction2 已提交的数据
(3)可重复读**:repeatable read**
- 保证transaction1 可以多次从一个字段中读取到相同的值,即在transaction1 执行期间禁止事务对这个字段进行更新
(4)串行化**:serializable**
- 保证transaction1 可以多次从一个表中读取到相同的行,在transaction1 执行期间,禁止其他事务对这个表进行添加,更新,删除操作。可以避免任何的并发问题,但是性能十分低下。
4.3 隔离级别对解决并发的能力
| | 脏读 | 不可重复读 | 幻读 | | :—-: | :—-: | :—-: | :—-: | | 读未提交 | 有 | 有 | 有 | | 读已提交 | 无 | 有 | 有 | | 可重复读 | 无 | 无 | 有 | | 串行化 | 无 | 无 | 无 |
五 如何处理事务
1)事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改将永久的保存下来;要么数据库管理系统将放弃所有的修改,整个事务归滚到最初的状态。
2)为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。
3)当一个连接对象被创建时,默认情况下是自动提交事务:每次执行一个SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
4)具体过程
(1)设置提交状态:SET AUTOCOMMIT = FALSE;
(2)以第一个 DML 语句的执行作为开始
(3)以下面的其中之一作为结束:
- COMMIT或ROLLBACK语句
- DDL 语句(自动提交)
- 用户会话正常结束
- 系统异常终止
5)COMMIT和ROLLBACK语句的优点
- 确保数据完整性。
- 数据改变被提交之前预览。
- 将逻辑上相关的操作分组。
6)数据完整性:存储在数据库中的所有数据值均处于正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性。
7)数据库采用多种方法来保证数据完整性,包括外键、束约、规则和触发器
(1)提交或回滚前的数据状态
- 改变前的数据状态是可以恢复的
- 执行 DML 操作的用户可以通过 SELECT 语句查询提交或回滚之前的修正
- 其他用户不能看到当前用户所做的改变,直到当前用户结束事务
- DML语句所涉及到的行被锁定,其他用户不能操作
(2)提交后的数据状态
- 数据的改变已经被保存到数据库中。
- 改变前的数据已经丢失。
- 所有用户可以看到结果。
- 锁被释放, 其他用户可以操作涉及到的数据。
(3)数据归滚后的状态
使用 ROLLBACK 语句可使数据变化失效:
- 数据改变被取消。
- 修改前的数据状态可以被恢复。