1.什么是事务?
一个事务是一个完整的业务逻辑单元(需要多条DML协同完成时需要用到事务),不可
再分;即同时成功或同时失败。
注意:和事务相关的DML语句有insert、delete、update;他的存在是为了保证数据的完整性和安全性。
2.事务的特性(ACID)
A: 原子性,事务是最小的工作单元不可再分
C: 一致性,事务必须保证统一事务中的多条DML语句同时成功或失败
I: 隔离性,事务A和事务B之间的隔离(四种隔离级别)
D: 持久性,最终数据必须持久化到硬盘上才算结束
3.事务的隔离级别
3.1 读未提交
读未提交(read uncommitted)
可以读到对方事务未提交的数据,容易出现脏读;
例如:A B 两个事务的共同操作是查询某商品库存数量,A 减少了10件库存,但最
终没有提交;在A事务结束之前B增加了库存数量,此时B读到的就是脏数据;
导致库存数量出错。(B是基于A减少后的库存数量增加的,但是A事务最终并
没有提交)
3.2 读已提交
读已提交(read committed)
可以读取到对方事务已提交的数据,解决了脏读;仍会出现不可重复读的问题
(即无法保证同一事务中相同的语句查到相同的结果)
例如:
3.3 可重复读
可重复读(repeatable read)
解决了不可重复读的问题,当前事务中相同的语句查到的结果是一致的;但是容
易出现幻读的问题。
例如:A B 两个事务要查XXX表记录的数量,A 先查到是100条,此时B删除了一条
数据,并且B在A之前提交。这个时候A事务查到到数量其实是不对的。
3.4 序列化读
也称为串行化读, 效率低,事务执行需要排队。
拓展
- Oracle数据库事务的隔离级别默认是读已提交
- Mysql数据库事务的默认隔离级别是可重复读
- 注意:Mysql默认情况下是自动提交事务的,只要执行一次DML语句,就提交一次;这种qing情况下我们执行rollback是无效的,因为事务已经提交。