一、常见的并发问题
在对数据库进行操作时,若多个事务同时进行可能会产生如下几个并发问题。
- 脏读,事务1修改了A字段,但是还未提交。这时候,事务2读取了A字段。若这个时候,事务1回滚,A字段恢复到原来的值,则事务2读到的数据是错误的。
- 不可重复读,事务2读取了A字段,与此同时事务1对A字段进行了修改,并完成了提交。则事务2读到的数据是错误的。
- 幻读,事务2读取了表中某一字段的所有值,然后事务1对表进行了插入操作。则事务2读取的数据有缺失。
二、什么是数据库事务隔离级别
数据库事务隔离级别,就是为了有效保证并发读取数据的正确性而提出的。
事务隔离级别越高,就越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
三、四种事务隔离级别
事务级别 | 事务名称 | 事务限制 | 可能出现的问题 |
---|---|---|---|
第一级别 | read uncommitted | 读未提交数据,允许事务读取未被其他事务所提交的变更数据 | 脏读,不可重复读,幻读 |
第二级别 | read commited | 读已提交数据,只允许事务读取已经被其他事务提交过的数据 | 不可重复读,幻读 |
第三级别 | repeatable read | 可重复读,为确保事务从字段中读取到的值不会被更新,在该事务进行期间,禁止其他事务对该字段的更新 | 幻读 |
第四级别 | serializable | 序列化,为确保事务可以从表中读取到的行数不被更新,在该事务进行期间,禁止其他事务对该表的插入、更新、删除操作 | 可避免所有并发问题,但会导致数据库操作效率极低 |
四、Mysql中的事务隔离级别
Mysql支持四种事务隔离级别,其默认事务隔离级别为: repeatable read
五、数据库事务的特性(ACID)
- 原子性(Atomicity)
事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。 - 一致性(Consistency)
事务一致性值得是在一个事务执行之前和执行之后数据库都必须处于一致性状态(中途是否一致不用管)。 - 隔离性(Isolation)
隔离性指的是并发的事务是相互隔离的。 - 持久性(Durability)
持久性指当系统或介质发生故障时,确保已提交的更新不能丢失,即写入磁盘。