事务的概念
多用户下死锁
事务的四大特性
事务的四大特性有:
- 原子性(Atomicity): 一个事务的操作要么全部成功要么全部失败
- 一致性(Consistency): 保持数据的逻辑一致,符合原子性不一定符合一致性,如转账增加的钱与减少的钱不一致
- 隔离性(Isolation): 多个用户并发操作同一数据时,数据库为每一个用户开的事务上锁,达到隔离的目的,即各事务间操作互不干扰
- 持久性(Durability): 事务一旦被提交,数据操作成功对数据库的修改是永久性的,即便数据库遇到故障也不会丢失。该事务提交的操作。
隔离性
没有隔离性会遇到的几种问题
- 更新丢失
指在进行写操作提交时还有另一个写操作在访问同一个数据,后者提交会覆盖前者的操作 - 脏读
指在写操作进行时读取到未修改数据的现象 - 不可重复读
在写事务进行时,同一个读的事务对同一数据两次读的操作读取到的数据不一致的情况 - 虚读(幻读)
两次读操作获取到的统计结果不一致的信息
不可重复读和幻读的区别:
不可重复读描述的是同一事务两次读取同一条数据得到不同的结果
幻读描述的是一个事务两次统计某张数据表,所得的结果不同
四种隔离级别:
- 读未提交 Read uncommitted
通过排他写锁实现,正在进行的写操作排斥另一个写操作
解决了更新丢失的问题,因为不排斥读操作,会出现脏读 - 读提交 Read committed
如果当前是写操作,会排斥其他事务操作;如果当前是读操作,则不会排斥其他事务操作
解决了更新丢失和脏读,但是因为读操作时不会排斥其他事务操作,所以会出现不可重复读和幻读 - 可重复读取 Repeatable read
读数据会禁止写操作但不会禁止读操作,写操作会禁止其他任何操作
解决了更新丢失、脏读、不可重复读的问题,因为此时只是对访问的数据上锁,其他用户可以在表中增加或删除数据,因此会出现幻读 - 可序列化 Serializable
对整个数据表上锁
隔离级别 | 更新丢失 | 脏读 | 不可重复读 | 虚读(幻读) |
---|---|---|---|---|
读未提交 | 解决 | 未解决 | 未解决 | 未解决 |
读已提交 | 解决 | 解决 | 未解决 | 未解决 |
可重复读 | 解决 | 解决 | 解决 | 未解决 |
序列化 | 解决 | 解决 | 解决 | 解决 |