目录
一、事务
1.什么是事务
2.事务的ACID特性
1.Atomicity (原⼦性)
2.Consistency (⼀致性)
3.Isolation (隔离性)
4.Durability (持久性)
3.为什么要使用事务
4. 如何使⽤事务
1.查看MySQL中支持事务的存储引擎
2.⾃动/⼿动提交事务
2.1自动提交事务
2.2手动提交事务
3.语法
5.事务的隔离性和隔离级别
1.什么是隔离性
2.隔离级别
3.不同隔离级别存在的问题
3.1READ UNCOMMITTED - 读未提交与脏读
3.2READ COMMITTED - 读已提交与不可重复读
3.3REPEATABLE READ - 可重复读与幻读
3.4SERIALIZABLE - 串⾏化
4.不同隔离级别的性能与安全
5.查看和设置隔离级别
1.查看不同作⽤域事务的隔离级别
2.设置事务的隔离级别和访问模式
一、事务
1.什么是事务
事务把⼀组SQL语句打包成为⼀个整体,在这组SQL的执⾏过程中,要么全部成功,要么全部失
败。这组SQL语句可以是⼀条也可以是多条。来看⼀个转账的例⼦,如图:
• 如果转账成功,应该有以下结果:
1. 张三的账⼾余额减少 100 ,变成 900 ,李四的账⼾余额增加了 100 ,变成 1100 ,不能出现张
三的余额减少⽽李四的余额没有增加的情况;
2. 张三和李四在发⽣转账前后的总额不变,也就是说转账前张三和李四的余额总数为1000+1000=2000 ,转账后他们的余额总数为 900+1100=2000 ;
3. 转账后的余额结果应当保存到存储介质中,以便以后读取;(持久化)
4. 还有⼀点需要要注意,在转账的处理过程中张三和李四的余额不能因其他的转账事件⽽受到干扰;
以上这四点在事务的整个执⾏过程中必须要得到保证,这也就是事务的 ACID 特性
2.事务的ACID特性
1.Atomicity (原⼦性)
⼀个事务中的所有操作,要么全部成功,要么全部失败,不会出现只执⾏了⼀半的情况,如果事务在执⾏过程中发⽣错误,会回滚( Rollback )到事务开始前的状态,就像这个事务从来没有执⾏过⼀样
支持事务的数据库中最基本的一个特性,一个SQL要么全部成功,要么全部失败
事务如果没有出现错误提交,数据进行落盘,永久保存
事务如果在执行中出现错误,则回滚到事务开始之前的状态
2.Consistency (⼀致性)
在事务开始之前和事务结束以后,数据库的完整性不会被破坏。这表⽰写⼊的数据必须完全符合所有的预设规则,包括数据的精度、关联性以及关于事务执⾏过程中服务器崩溃后如何恢复
事务执行完成之后,保证数据的正确并且符合预期
3.Isolation (隔离性)
数据库允许多个并发事务同时对数据进⾏读写和修改,隔离性可以防⽌多个事务并发执⾏时由于交叉执⾏⽽导致数据的不⼀致。事务可以指定不同的隔离级别,以权衡在不同的应⽤场景下数据库性能和安全
多个事务之间不能相互影响
4.Durability (持久性)
事务处理结束后,对数据的修改将永久的写⼊存储介质,即便系统故障也不会丢失
事务一旦查询,就需要永久的保存到存储介质中,不论数据库软件或电脑和操作系统是否崩溃,都不会影响数据的安全(不能丢失)
3.为什么要使用事务
事务具备的ACID特性,是我们使⽤事务的原因,在我们⽇常的业务场景中有⼤量的需求要⽤事务
来保证。⽀持事务的数据库能够简化我们的编程模型,不需要我们去考虑各种各样的潜在错误和并发问题,在使⽤事务过程中,要么提交,要么回滚,不⽤去考虑⽹络异常,服务器宕机等其他因素,因此我们经常接触的事务本质上是数据库对 ACID 模型的⼀个实现,是为应⽤层服务的。
如果数据库不能保持事务,那么业务系统(程序)也要去保证事务
4. 如何使⽤事务
1.查看MySQL中支持事务的存储引擎
2.⾃动/⼿动提交事务
每执行一条update insert delete 都会包含在事务当中
• 默认情况下,MySQL是⾃动提交事务的,也就是说我们执⾏的每个修改操作,⽐如插⼊、更新和删除,都会⾃动开启⼀个事务并在语句执⾏完成之后⾃动提交,发⽣异常时⾃动回滚。
• 查看当前事务是否⾃动提交可以使⽤以下语句
2.1自动提交事务
事务自动提交的情况下,一个事务中包含SQL,也就是说执行的增删改的操作会立刻提交
2.2手动提交事务
事务手动提交,不用手动开启事务,执行完SQL之后,手动COMMIT或ROLLBACK
3.语法
# 开始⼀个新的事务
START TRANSACTION;
# 或
BEGIN;
# 提交当前事务,并对更改持久化保存
COMMIT;
# 回滚当前事务,取消其更改
ROLLBACK;
• START TRANSACTION 或 BEGIN 开始⼀个新的事务;
• COMMIT 提交当前事务,并对更改持久化保存;
• ROLLBACK 回滚当前事务,取消其更改;
• ⽆论提交还是回滚,事务都会关闭
5.事务的隔离性和隔离级别
1.什么是隔离性
MySQL服务可以同时被多个客⼾端访问,每个客⼾端执⾏的DML语句以事务为基本单位,那么不
同的客⼾端在对同⼀张表中的同⼀条数据进⾏修改的时候就可能出现相互影响的情况,为了保证不同的事务之间在执⾏的过程中不受影响,那么事务之间就需要要相互隔离,这种特性就是隔离性
2.隔离级别
事务间不同程度的隔离,称为事务的隔离级别;不同的隔离级别在性能和安全⽅⾯做了取舍,有
的隔离级别注重并发性,有的注重安全性,有的则是并发和安全适中;在MySQL的InnoDB引擎中事务的隔离级别有四种,分别是:
并发:多个客户端可以同时进行数据操作 安全:相互之间影响的程序
3.不同隔离级别存在的问题
3.1READ UNCOMMITTED - 读未提交与脏读
3.2READ COMMITTED - 读已提交与不可重复读
3.3REPEATABLE READ - 可重复读与幻读
3.4SERIALIZABLE - 串⾏化
4.不同隔离级别的性能与安全
5.查看和设置隔离级别
1.查看不同作⽤域事务的隔离级别
# 全局作⽤域
SELECT @@GLOBAL.transaction_isolation;
# 会话作⽤域
SELECT @@SESSION.transaction_isolation;
2.设置事务的隔离级别和访问模式
# 通过GLOBAL|SESSION分别指定不同作⽤域的事务隔离级别
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL level|access_mode;
# 隔离级别
level: {
REPEATABLE READ # 可重复读| READ COMMITTED # 读已提交| READ UNCOMMITTED # 读未提交| SERIALIZABLE # 串⾏化
}