一、事务 transaction
1.什么是事务
数据库事务用来保证 多个SQL要么全成功,幺妹全失败,英文叫transaction。
MySQL数据库会自动管理事务,Oracle数据库需要程序员管理事务
MySQL也允许程序员手动管理事务
2.事务的四个特性ACID
事务的四个特性:
原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
1. 原子性
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
2. 一致性
一致性:保持数据守恒,将来广泛应用到分布式系统里
3. 隔离性
隔离性:MySQL数据库支持高并发,可能会有数据安全的隐患,也有复杂的隔离级别
4. 持久性
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
3. 隔离级别
事务隔离为不同级别,包括
- 读未提交(Read uncommitted) 安全性最差,可能发生并发数据问题,性能最好
- 读提交(read committed) Oracle默认的隔离级别
- 可重复读(repeatable read)MySQL默认的隔离级别,安全性较好,性能一般
- 串行化(Serializable) 表级锁,读写都加锁,效率低下,安全性高,不能并发
4.查询mysql的隔离级别
在默认情况下,MySQL每执行一条SQL语句,都是一个单独的事务。如果需要在一个事务中包含多条SQL语句,那么需要手动开启事务和结束事务。
- 开启事务:start transaction;
- 结束事务:commit(提交事务)或rollback(回滚事务)。
5.测试
窗口1:
mysql> use cgb2022; #使用数据库,准备往表里插入数据
mysql> start transaction; #开启事务start transaction
mysql> insert into g values(null,'jack',20); #多条执行增删改的SQL
mysql> select * from g; #这里在窗口2是查不到的jack这条数据的,因为没有提交事务,可能会在窗口1查到,但那只是暂时性的
mysql> commit; #提交事务commit,不提交的话别人查不到,没有持久影响
窗口2:
mysql> use cgb2022;
mysql> select * from g; #窗口1不执行commit,这里永远查不到新增的数据
这是窗口1没有提交事务,在窗口2查询到的数据
这是窗口1提交事务之后,在窗口2查询到的数据
提交commit
#多条语句时,批量执行,事务提交
#有了事务,多步操作就形成了原子性操作,高并发下也不会引起数据错乱
#mysql的事务默认就是开启的 -- 多条语句一起操作时,要么一起成功要么一起失败
回滚rollback
#多条语句,批量执行,insert插入重复的主键导致失败时,事务回滚