什么是事务
一个事务是一个完整的业务逻辑单元,不可再分。事务的存在是为了保证数据的完整性、安全性。
案例:实现银行账户转账业务,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删除。
开启事务机制
执行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中演示事务和事务隔离性
一些常用命令
start transaction;
commit;
rollback;
set global transaction isolation level 级别;
select @@global.tx_transaction;
演示read committed:
演示repeatable read:
演示都大同小异~就不放贴图啦
|