本文主要是介绍6.9学习总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
事务
事物是一组操作的集合,事物会把所有的操作作为一个整体一起提交或者撤回,所以这些操作要么同时成功要么同时失败。
四大特性ACID
原子性(Atomicity):事务是不可分割的最小操作单位,要么全部成功,要么全部失败。
一致性(Consistency):事务完成时,必须使所有数据都保持一致状态。
隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
并发事务(多个事务同时运行时出现的问题)
问题 | 描述 |
脏读 | 多个事务同时运行时,一个事务读取到了另一个事务未提交的数据 |
不可重复读 | 多个事务同时运行时,一个事务对同一条数据进行多次查找,所得到的数据不同 |
幻读 | 多个事务同时运行时,一个事务在同一条件下多次进行查找,所得到的数据的条数不同 |
通俗解释:
脏读:一个事务读取了另一个事务中未提交的数据,导致得到了不一致和不准确的数据。
不可重复读:一个事务读取到了另一个事务中已提交的被改变的数据,导致了对同一条数据进行多次查找得到不同结果。
幻读:一个事务读取到了另一个事务中已提交的插入或者删除的数据。导致在同一条件下查找,所得到的数据的条数不同。
并发事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable Read(默认) | × | × | √ |
Serializable | × | × | × |
- √表示在当前隔离级别下该问题会出现
- Serializable 性能最低;Read uncommitted 性能最高,数据安全性最差
例子:
- Read uncommitted:事务A读取到事务B未提交的修改,如果事务B回滚,则事务A读取到的数据就成了脏数据。
- Read committed:事务A第一次读取某数据行,接着事务B修改并提交该数据行,然后事务A再次读取时,发现数据已经被修改,这就是不可重复读。
- Repeatable Read:事务A在开始时读取某数据行,然后事务B修改并提交该数据行,但事务A在其生命周期内再次读取同一数据行时,仍然看到的是最初的数据,而不是事务B修改后的数据。
- Serializable:事务A执行一个范围查询操作,然后事务B试图插入或修改范围内的数据时,被阻塞,直到事务A完成,确保事务A不会看到任何新的或修改的数据行。
事务的运行过程
先开起事务(标记一个事务的开始),然后执行想要在一个事务中运行的语句,最后可以根据情况选择提交事务(事务运行成功,数据改变)或者回滚事务(事务运行失败,数据回到开始事务之前),至此一个事务结束。
例:
启动事务
启动事务(BEGIN 或 START TRANSACTION): 在执行数据库操作之前,使用 BEGIN 或 START TRANSACTION 命令启动事务。这会告诉数据库管理系统,接下来的一系列操作将作为一个事务执行。
BEGIN;
-- 或者
START TRANSACTION;
执行数据库操作
执行数据库操作:执行想要放在一个事务中的操作例如插入数据、更新数据、删除数据等。
insert into topic(topicid) values(1);
update topic set topicid=0;
delete from topic where topicid=0;
提交事务
提交事务:如果在执行过程中没有发生错误,并且希望保存所有已经执行的操作,则使用 COMMIT 命令提交事务。提交操作将确保事务中的所有修改被永久保存到数据库中。
commit;
查看事务隔离级别:
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别:
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
SESSION 是会话级别,表示只针对当前会话有效,GLOBAL 表示对所有会话有效
这篇关于6.9学习总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!