目录
一、事务特性
原子性
事务是一个不可分割的最小工作单元,事务中的所有操作要么全部提交成功,要么
全部失败回滚。
案例:A给B转账,A减少余额和B新增余额这两个操作要么都成功,要么都失败。
一致性
事务总是从一种合理状态转为另一种合理状态,不能出现中间状态。
例如:A银行卡余额减少多少对应B银行卡余额就新增多少,不能说A余额减少了B不变,钱不翼而飞了。
隔离性
事务之间的操作是相互隔离的,各个事务之间互不干扰。
持久性
一旦事务提交,则其所做的修改会永久保存到磁盘(数据库)。
二、事务的隔离级别
数据库默认隔离级别
- SQLServer默认隔离级别是读已提交。
- MySQL默认隔离级别是可重复读。
隔离级别相关命令
-- 查看默认的隔离级别 两种方式
SHOW VARIABLES LIKE 'transaction_isolation';
SELECT @@transaction_isolation;
-- 开启事务 两种方式
START TRANSACTION或者BEGIN;-- 开启事务
COMMIT; -- 提交
ROLLBACK;-- 回滚
-- 关闭自动提交事务
set autocommit = 0;
-- 设置会话的隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;-- 读未提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 读已提交
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 可重复读
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;-- 串行化
读未提交(READ UNCOMMITTED)
同时开启两个事务A和B,A事务修改了某条数据还未提交,B事务读取了未提交事务的数据。存在脏读问题。
场景演示:
- 打开两个Navicate窗口A,B,分别更改MySQL默认隔离级别可重复读 -> 读未提交。
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;-- 读未提交
SHOW VARIABLES LIKE 'transaction_isolation';-- 查看隔离级别
set autocommit = 0; -- 禁止事务自动提交
- A窗口开启事务A修改User表中的数据但是不提交。
BEGIN;
UPDATE user SET username="事务A修改" where id = 1;
- B窗口开启事务B读取user表id为1的数据。
begin;
select * from user where id = 1