共计 967 个字符,预计需要花费 3 分钟才能阅读完成。
对数据库而言,其显著的特色是资源能够被多个用户共享。当雷同的数据库资源被多个用户 (多个事务) 同时拜访时,如果没有采取必要的隔离措施,就会导致各种并发问题,毁坏数据的完整性。
如果不思考隔离性,数据库将会存在三种并发问题。
1. 脏读
一个事务读到了另一个事务尚未提交的更改数据。例如,事务 T1 批改某一数据后,事务 T2 读取同一数据,而后事务 T1 因为某种原因被吊销,这时 T1 已批改过的数据恢复原值,T2 读到的数据就与数据库中的数据不统一,其读到的数据就为 ” 脏 ” 数据,对该数据的操作也无奈抵赖。
2. 不可反复读
不可反复读是指一个事务读取页游数据后,另一个事务执行更新操作,使第一个事务无奈再现前一次的读取后果。例如,事务 T1 读取 B =100 进行运算,事务 T2 读取同一数据 B,对其进行批改后将 B =200 写回数据库。这时,T1 为了对读取值校对重读 B,B 已为 200,与第一次读取值不统一。
3. 幻读
幻读是指一个事务读取数据后,另一个事务执行插入操作,使第一个事务无奈再现前一次的读取后果。例如,事务 T1 两次统计所有账户的总金额,在这期间,事务 www.sangpi.comT2 插入了一条新记录,使得两次统计的总金额不统一。
为了解决并发造成的问题,数据库标准定义了四种隔离级别,用于限定事务之间的可见性,不同事务隔离级别可能解决的数据并发问题的能力是不同的,具体如表 2.1 所示。
表 2.1 数据库的隔离级别
1
read uncommitted (读未提交),一个事务读到另一个事务没有提交的数据。
read committed (读已提交),一个事务读到另一个事务曾经提交的数据。
repeatable read (可反复读),在一个事务中读到的数据始终统一,无论别的事务是否提交。
serializable(串行化),同时只能执行一个事务,相当于是事务中的单线程。
以上四种隔离级别安全性最高的是 serializable (串行化),最低的是 read uncommitted(读未提交),当然平安性能越高,执行效率就越低。像 serializable(串行化)这样的级别,就是以锁表的形式,使得其余的事务只能在锁外期待,所以平时选用何种隔离级别应该依据理论状况。MySQL 数据库默认的隔离级别为 repeatable read (可反复读)。