数据库事务
数据库事务
事务:是数据库管理系统执行过程中的一个逻辑单位,由多条数据库操作语句构成。
一、事务的四个性质(ACID)
- 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
- 一致性(Consistency):事务应确保数据库的状态从一个正确的状态转变为另一个正确的状态。正确状态的含义是数据库中的数据应满足完整性约束。
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
- 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。
二、事务的四个隔离级别
多个事务同时操作同样的数据时会产生一些问题:
脏读:一个事务读取到另一个事务未提交的数据
不可重复读:在执行一个事务时,事务内前后两条一样的select语句读取到的数据不一致,原因是读到另一个事务已提交的增删改的数据。
幻读:一个事务已开启,在提交前和提交后发现select语句读取到的数据不一致,提交后数据变多了。原因是在提交前有另一个事务提交增加了数据,而在提交前因为是可重复读所以看不到数据变多了,提交后再次执行事务就发现数据变多了,像是产生了幻觉一样。
不可重复读与幻读的区别:
不可重复读是指,在执行一个事务时,事务内的前后两条select语句读取的数据不一致。事务只执行一次。
幻读是指,同一个事务执行两次,这两次读取的数据不一致。事务执行了两次。
顺便一提:一般来说产生幻读的现象是正常的,但是有一些业务逻辑希望不产生幻读,于是就加了锁来避免幻读。类似于多线程加锁的机制,不允许两个事务同时增删改同一条数据,一个事务想要增删改同一条数据时,需要等待其他事务对这条数据增删改完成,等待的过程称为阻塞状态。
设置以下四个隔离级别可以解决上面的问题
read-uncommited:
读未提交,设置此隔离级别会产生的问题有:脏读、不可重复读、幻读。
read-commited :
读已提交,设置此隔离级别会产生的问题有:不可重复读、幻读。(oracle默认)
repeatable-read :
可重复读,设置此隔离级别会产生的问题有:幻读。(mysql默认)
serializable :
串行化(锁表),设置此隔离级别不会有问题产生。
以上四个隔离级别从上到下安全性越来越高,但是效率越来越低。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | 是 | 是 | 是 |
读已提交 | 是 | 是 | |
可重复读 | 是 | ||
序列化 |
推荐文章: