事务
参考资料:黑马程序员
简介
事务是一组不可分割的操作,它们要么同时成功,要么同时失败。
如果事务中只要有一个操作失败,那么整个事务的操作就会同时失败,称为回滚事务
从而保证了数据库操作的完整性和严谨性
事务提交的两种方式
方式一:将事务提交方式改为手动提交
自动提交(MySQL默认):每条语句都独立为一个事务,当一条语句执行后,自动提交到数据库,修改数据库的数据
手动提交:语句执行后不直接提交给数据库,而是给到临时数据,当执行COMMIT语句手动提交事务后,临时数据才会对数据库生效
- 查看 MySQL 客户端的事务提交方式
SELECT @@autocommit;
- 设置事务提交方式
SET @@autocommit = 0;
- 提交事务
COMMIT;
- 回滚事务
ROLLBACK;
方式二:通过开启事务的方式
- 开启事务
START TRANSACTION 或 BEGIN;
- 提交事务
COMMIT;
- 回滚事务
ROLLBACK;
和开启事务同时执行的语句并为一个事务,一个整体。事务执行成功,提交事务;事务执行失败,回滚事务
事务四大特性
-
原子性(不可分割性):事务时不可分割的最小单元,同时成功,同时失败
-
一致性(守恒性):事务的一致性就是模拟现实生活的守恒规则而实现的特性。现实世界许多东西是守恒的,如账户余额,给银行卡存钱,现金减少-1000,银行卡余额就增加1000,而计算机不一定会遵守这种规则。假设存钱后,银行服务器忽然宕机,那么银行卡的余额就不会增加1000,那么自己的钱就少了1000,不守恒了。而为了让数据库符合现实生活的要求,所以有了事务的一致性。
-
隔离性:数据库系统提供的隔离机制使得一个事务的执行不被另一个事务的执行干扰,可以在并发的情况下独立运行(后面详细介绍)。
-
永久性:指一个事务一旦提交,它对数据库中数据的改变是永久的。
并发事务问题
问题
1.脏读:
A事务读取到B事务尚未提交的更改数据,并在这个数据的基础上操作。如果恰巧B事务回滚,那么A事务读到的数据根本是不被承认的。
2.不可重复读:
不可重复读是指 A事务先后读取了同一条记录,而该记录可能在A事务先后读取之间被事务 B 提交的数据修改,而导致事务A先后读取的数据不同 。
3.幻读:
一个事务按照条件查询数据时,没有对应的数据行,但是在事务A插入数据前,事务B插入了数据,在事务A插入数据时发现这行数据已经存在。
幻读和脏读的区别
- 幻象读和不可重复读是两个容易混淆的概念,前者是指读到了其他已经提交事务的新增数据,而后者是指读到了已经提交事务的更改数据(更改或删除)
事务的隔离级别(对并发事务问题的解决)
种类
-
Read uncommitted(未提交读)
A事务已执行,但未提交;B事务查询到A事务的更新后数据;A事务回滚;—出现脏数据
-
Read committed(已提交读)
A事务执行更新;B事务查询;A事务又执行更新;B事务再次查询时,前后两次数据不一致;—不可重复读
-
Repeatable Read(默认 可重复读)
A事务无论执行多少次,只要不提交,B事务查询值都不变;B事务仅查询B事务开始时那一瞬间的数据快照;
-
Serializable(可串行化)
不允许读写并发操作,写执行时,读必须等待;效率最低
设置事务的隔离级别操作
- 查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
- 设置事务隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE}
SESSION:当前会话,在当前连接立即生效
GLOBAL:全局,不包含当前连接,之后新获取的连接都会生效,因此修改事务隔离级别设置时,需要保持打开的窗口一致,每个窗口都要执行一下修改语句(针对session立即生效,如果是global的话,需要重新打开一个窗口)
TRANSACTION:事务
ISOLATION:隔离
LEVEL:级别,水平