文章目录
- 前言
- 一、事务的概念
- 二、数据库中的事务
-
- 1.事务的特性 ACID
- 2.事务的隔离级别
- 三、数据库事务的操作
-
- 1.什么情况下会出现事务
- 2.开启事务(取消自动提交) 、回滚事务、提交事务
- 总结
前言
一个事务是一个完整的业务逻辑单元,不可再分。可以理解为一件完整的事情。
提示:以下是本篇文章正文内容,下面案例可供参考
一、事务的概念
事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。
例如,A向B转账100,会其中要扣除A账户100,然后增加B账户100,这两步要么都成功,要么都失败,否则会出现问题
二、数据库中的事务
1.事务的特性 ACID
事务包含四大特性:原子性、一致性、隔离性、持久性。
-
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要 么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败
-
一致性(Consistency)
官网上事务一致性的概念是:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。以转账为例子,A向B转账,假设转账之前这两个用户的钱加起来总共是2000,那么A向B转账之后,不管这两个账户怎么转,A用户的钱和B用户的钱加起来的总额还是2000,这个就是事务的一致性。
-
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
-
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
注意:事务的四大特性中最麻烦的是隔离性,下面重点介绍一下事务的隔离级别
2.事务的隔离级别
引用自这篇文章
- 串行化(Serializable,SQLite默认模式):最高级别的隔离。两个同时发生的事务100%隔离,每个事务有自己的"世界", 串行执行。
- 可重复读(Repeatable read,MySQL默认模式):如果一个事务成功执行并且添加了新数据(事务提交),这些数据对其他正在执行的事务是可见的。但是如果事务成功修改了一条数据,修改结果对正在运行的事务不可见。所以,事务之间只是在新数据方面突破了隔离,对已存在的数据仍旧隔离。
- 读取已提交(Read committed,Oracle、PostgreSQL、SQL Server默认模式):可重复读+新的隔离突破。如果事务A读取了数据D,然后数据D被事务B修改(或删除)并提交,事务A再次读取数据D时数据的变化(或删除)是可见的。这叫不可重复读(non-repeatable read)。
-
读取未提交(Read uncommitted):最低级别的隔离,是读取已提交+新的隔离突破。如果事务A读取了数据D,然后数据D被事务B修改(但并未提交,事务B仍在运行中),事务A再次读取数据D时,数据修改是可见的。如果事务B回滚,那么事务A第二次读取的数据D是无意义的,因为那是事务B所做的从未发生的修改(已经回滚了嘛)。这叫脏读(dirty read)
事务的隔离级别对应的sql操作
1.查看事务隔离级别 SHOW VARIABLES LIKE 'tx_isolation'; 2.查看全局事务隔离级别 SHOW GLOBAL VARIABLES LIKE 'tx_isolation'; 3.使用系统变量查询 SELECT @@global.tx_isolation; SELECT @@session.tx_isolation; SELECT @@tx_isolation; 4.设置Mysql的事务隔离级别 GLOBAL:设置全局的事务隔离级别 SESSION:设置当前session的事务隔离级别,如果语句没有指定GLOBAL或SESSION,默认值为SESSION SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL { REPEATABLE READ 可重复读 | READ COMMITTED 读取已提交 | READ UNCOMMITTED 读取未提交 | SERIALIZABLE 串行化 } 5.使用系统变量设置事务隔离级别 SET GLOBAL tx_isolation='REPEATABLE-READ'; SET SESSION tx_isolation='SERIALIZABLE';
三、数据库事务的操作
首先明确一点,Mysql 数据库默认事务是自动提交的。
1.什么情况下会出现事务
默认情况下,一条DML(增删改)语句就是一个事务。或者手动开启 一个事务 。
2.开启事务(取消自动提交) 、回滚事务、提交事务
1.开启事务后,此事务的自动提交会关闭,需以回滚事务,或提交事务来结束事务
start transaction;
2.回滚事务,是指撤销【开启事务】至【回滚事务】之间的所有DML操作
rollback;
3.提交事务,是指将【开启事务】至【提交事务】之间的所有DML操作执行并持久化到数据库
commit;
总结
关于事务的优秀文章推荐此链接