数据库 事务
数据库 事务(Transaction)
数据库事务的定义和使用,隔离级别以及通过隔离能够解决的问题
定义
事务是一个操作集合,这些操作要么全都执行,要么全部不执行。
要么所有操作都成功,要么就都不成功,如果执行中有某一项操作失败,其之前所有的操作都回滚到未执行这一系列操作之前的状态。
特性(ACID)
- 原子性(Atomicity):一个事务中的所有操作,要么执行要么都不执行,中途不会结束。如果发生错误,会被回滚到执行之前的状态。
- 一致性(Consistency):事务完成之后,数据库的完整性没有破坏,符合数据库预定的规则。从一个一致性状态变为另一个一致性状态。
- 隔离性(Isolation):事务之间是互相隔离,互不干涉的。该事务以外的实体不知道事务的中间流程细节。在多个事务并发执行时,可以防止交叉执行导致的数据不一致的问题。
- 持久性(Durable):事务处理结束后,对数据的修改就是永久的。
事务控制语句
- BEGIN 或 START TRANSACTION 显式开启事务
- COMMIT 或 COMMIT WORK 提交事务
- ROLLBACK 或 ROLLBACK WORK 回滚事务
- SAVEPOINT identifier 保存一个叫identifier 的保存点
- RELEASE SAVEPOINT identifier 删除这一保存点
- ROLLBACK TO identifier 回滚到保存点
- SET TRANSACTION 设置隔离级别
可解决的问题
1.脏读的问题
比如有两个事务A,事务B
A事务读取B事务还未提交的事务,此时如果B事务发生错误,并回滚了事务,这是A事务读到的数据就是脏数据。称之为脏读。
eg:取款事务,转账事务
2.不可重复读的问题(前后多次读取,数据内容不一致)
eg:事务A要运行很长时间,第一次查询小明年龄20岁,之后他就执行其他操作,此时事务B也在执行,事务B把小明年龄改为30岁,事务A第二次查询小明年龄就变成了30。
3.幻读的问题(前后多次读取,数据总量不一致)
eg:与不可重复读类似。前后的数量不一致。
二者区别在于:
不可重复读 update 造成的数据不一致
幻读 insert , delete 造成的数量不一致
隔离分不同的等级:
- 读未提交 READ UNCOMMITTED
一个事务可以读取到另一个事务还未提交的数据,这会产生脏读。另外不可重复读,幻读也会发生。
读提交 READ COMMITTED
与读未提交相反,该隔离级别只能读取到其他事务已经提交的数据,那些没有提交的数据是读不出来的。解决了脏读的问题,但是产生不可重复读和幻读的问题。可重复读 REPEATABLE READ
该隔离级别可以让事务在自己的会话中重复读取数据 并且不会出现结果不一样的状况
即使其他事务已经提交了,也依然还是显示以前的数据。解决了脏读,不可重复读问题,insert,delete还是不行,解决不了幻读的问题。串行化 SERIALIZABLE
解决所有问题的隔离级别。但为之带来的就是性能的衰落。只能顺序执行。
参考
数据库 事务
http://zanderchan666.github.io/2023/10/25/事务/