- 什么是事务
- 事务机制的原理(简单理解)
- 事务的四特性(原子、一致、隔离、持久)
- 事务的隔离性(四隔离级别)
- mysql中演示事务和事务隔离性
- 一些常用命令
一个事务是一个完整的业务逻辑单元,不可再分。事务的存在是为了保证数据的完整性、安全性。
案例:实现银行账户转账业务,A向B转100元。
实现:两条update语句,A-100,B+100。
update t_act set balance = balance - 100 where actno = 'A'; update t_act set balance = balance + 100 where actno = 'B';
此业务中,上述两条DML语句必须同时成功或同时失败。这就需要用到“事务机制”
ps:
1.和事务相关的语句:DML语句(insert、delete、update)
WHY:因为DML语句与数据库的数据有关,事务机制就是为了保证数据的完整性、安全性。
2.如果所有业务都可以用一条DML语句完成那么还需要事务机制吗?
不需要。
举例:完成一个业务需要三条DML语句:A添加、B修改、C删除。
简单理解就是DML语句A、B、C捆绑在一起,ABC要么同时成功,要么同时失败。
- TCL命令:
commit(提交)
rollback(回滚)
savepoint(保存点)
事务的隔离性(四隔离级别)
- 原子性:事务是最小单元不可再分。通过undolog实现
- 持久性:最终数据必须持久化到硬盘中,事务才算成功。通过redolog实现
- 隔离性:事务与事务之间具有隔离性。通过(读写锁+MVCC)来实现
- 一致性:事务必须保持多条DML语句同时成功或同时失败。通过原子性,持久性,隔离性共同实现。
| 特点(以同时处理相同表数据的事务A与事务B来举例) | |
|---|---|
| 第一级别:read uncommitted | 读未提交。A未提交,B也可以看到A未提交的数据,所以会看到脏数据,脏数据是不稳定的。 |
| 第二级别:read committed | 读已提交。A提交了,B就可以看到,B进行时总受A影响,原始数据一经A修改并提交,那么B就不可再看到原始数据,此为不可重复读 |
| 第三级别:repeatable read | 可重复读。A提交了,B也提交了,B才可以看到。A与B同时进行时不受对方视觉上的影响,但看到的原始数据是幻象。系统对幻象数据的处理命令也不会报错。 |
| 第四级别:serializable | 序列化/串行化读。A和B不可以同时处理同一数据,要排队,解决上述所有问题,但效率低 |
隔离级别越高,数据库事务并发执行性能越差,能处理的操作越少。所以一般地,推荐使用REPEATABLE READ级别保证数据的读一致性。对于幻读的问题,可以通过加锁来防止。
| 数据库 | 支持的隔离级别 | 默认的隔离级别 |
|---|---|---|
| MYSQL | 四种 | repeatable read |
| ORACLE | 只read committed、serializable | read committed |
//mysql中事务是自动提交的,每执行一条DML就提交一次。 start transaction; //关闭自动提交(每次commit后要重新关闭) commit; //手动提交命令 rollback; //回滚到上一个commit set global transaction isolation level 级别;//设置隔离级别,后需重启mysql select @@global.tx_transaction; //察看隔离级别
演示read committed:
演示repeatable read:
演示都大同小异~就不放贴图啦



