一、概念
事务是指一组不可分割的数据库操作序列,这组操作要么全部成功提交,要么全部失败回滚(Rollback)。
简单的说,事务就是一个整体,里面的内容要么都执行成功,要么都不成功。不可能存在部分执行成功而部分执行不成功的情况。
二、事务的特征
-
原子性:事务是一个原子操作,被视为不可分割的最小工作单元。
-
一致性:事务开始之前和结束之后,数据库必须保持一致性状态。
比如说,张三给李四转账100元,这个事务就是让张三账户上减去100元,李四账户上加上100元;一致性是指其他事务看到的情况是要么是张三还没有给李四转账的状态,要么是李四已经成功接收到张三的100元转账。而对于张三少了100元,李四还没加上100元这个中间状态是不可见的。
-
隔离性:事务之间互不干扰。
-
持久性:一旦事务被提交,其所做的修改将永久保存在数据库中。
三、事务操作
1、查看/设置事务提交方式
select @@ autoCommit;
set @@ autoCommit=0;
在MySQL中,select @@ autoCommit;和set @@ autoCommit=0;是用来查看和设置当前会话的自动提交状态的命令。
select @@ autoCommit:这条命令用于查询当前会话的自动提交(autocommit)设置。@@autocommit是一个系统变量,表示是否启用自动提交模式。如果返回值为1,意味着自动提交是开启的,即每次执行完一条SQL语句后,改动会立即保存到数据库中,成为永久性的变更。如果返回值为0,则表示自动提交是关闭的,你需要手动控制事务的提交与回滚。
set @@ autoCommit=0:这条命令用于设置当前会话的自动提交模式为关闭状态。将@@autocommit的值设为0后,意味着在该会话中执行的SQL语句不会自动提交,直到你显式执行COMMIT命令才将事务中的更改永久保存。这样可以让你在一系列操作之间保持数据的一致性,便于实现事务的原子性、一致性、隔离性和持久性(ACID特性)。在需要手动控制事务边界的应用场景中非常有用。
2、开启事务
start transaction;
3、提交事务
commit;
4、回滚事务
rollback;
三、举例
张三转账给李四1000元
(1)、转账之前张三李四各有2000元
(2)、没有事务并且没有异常的情况下转账
-- 张三转账给李四1000块钱
select * from `transfer accounts` where name='张三';
-- 张三账户-1000
update `transfer accounts` set balance=balance-1000 where name='张三';
-- 李四账户+1000
update `transfer accounts` set balance=balance+1000 where name='李四';
可以正常转账
(3)、在没有事务但有异常的情况下
张三账户-1000,但李四账户并没有+1000,
(4)、加上事务的操作
结果是没有转账成功!所以事务也就发挥作用了。
四、事务并发问题
在多用户和网络环境下,事务的并发操作可能会产生以下问题:
丢失修改:两个事务读入同一数据并修改,某一事务提交的结果破坏了另一事务的结果导致其修改丢失。
脏读:一个事务读取到另一个事务还没有提交的数据。
不可重复读:一个事务先后读取同一个记录,但两次读取的数据不同。因为一事务读取数据后,而另一事务执行更新操作,使前一事务无法再现前一次读取结果。重点在于修改了。
幻读:一个事务读取了几行数据,接着另一个并发事务插入了一些数据,在随后的查询中,第一个事务就会发现一些原本不存在的记录,就好像发生了幻觉一样。重点在于增加或删除了。
五、事务隔离级别
为了解决这些问题,数据库系统引入了事务的隔离级别。事务的隔离级别主要包括以下四种:
-
Read Uncommitted(读取未提交内容):一个事务可以查看到未提交的内容,常产生脏读问题。
-
Read Committed(读取提交内容):一个事务只能查看已提交的内容,常产生不可重复读的问题。
-
Repeatable Read(可重读):同一事务的多个实例并发读取数据时得到同一结果,MySQL的默认事务隔离级别,常产生幻读问题。
-
Serializable(可串行化):最高隔离级别,给事务加上共享锁,同时只能有一个事务操作,解决幻读问题,但会导致大量超时和锁竞争问题。
事务隔离级别 | 标记 | 值 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|---|
读未提交 | READ-UNCOMMITTED | 0 | 是 | 是 | 是 |
读已提交 | READ-COMMITTED | 1 | 否 | 是 | 是 |
可重复读 | REPEATABLE-READ | 2 | 否 | 否 | 是(x) |
串行化 | SERIALIZABLE | 3 | 否 | 否 | 否 |