事务特性:
ACID特性
1.原子性atomicuty
即是事务在提交的过程中,要么全部提交,要么全部不提交,成功提交之后,持久化更新;提交失败,本次事务全部回滚。【非0即1】这是保证数据一致性的关键
2.一致性consistency
在事务提交之后,数据处于一致性的状态。
3.隔离性isolation
每一个事务相对其他事务来说是黑盒的,透明的,独立的。各个事务之间的执行是不会交叉的。
4.持久性durability
在一次事务提交之后,对数据表的影响就是永久的,直到被其他事务再次修改。
事务隔离级别:
数据库系统有4个隔离级别,从低到高分别是:未提交读、已提交读、可重复读、串行化。
1、未提交读Read uncommited,问题:脏读。
不添加共享锁。分为2种情况:
①情况1:事务B可以在事务A对记录的读取过程中修改同一记录,可能会导致事务A读取的数据是一个被破坏的或者是不完整不正确的数据。
②情况2:在事务A中可以读取到事务B中修改过的数据,但此时事务B尚未提交。可能会发生的问题就是脏读。
2、已提交读Read commited,问题:不可重复读。
在事务A中读取数据时对记录添加共享锁,待读取结束后才会立即释放该锁。那么事务B对该数据的修改要一直等待,直到A中的读取过程结束,但不是整个事务A的结束。所以,可能发生的问题就是事务A在不同阶段对同一记录的读取结果可能是不同的。
3、可重复读Repeatable read,问题:幻读。
对于读出的记录,添加共享锁直到事务A结束。事务B试图对这个记录的修改会一直等待,直到整个事务A结束。InnoDB 默认的事务隔离级别就是可重复读。可能发生的问题:当执行一个范围查询时,可能会发生幻读(解决幻读的方法:增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读)。
4、串行化Serializable,问题:没有问题,上述3种级别中的脏读、不可重复读、幻读都不会发生。
添加范围锁(比如表锁,页锁等),直到事务A结束。以此阻止事务B对此范围内的修改操作。
(原文链接:https://blog.csdn.net/u012556994/article/details/81154022)
事务隔离级别与并发问题


调度算法:
锁技术控制并发操作
锁类型:
X锁,写锁,排他锁,exclusive locks用于数据写操作前进行锁定。如果事务T对数据A加上X锁,就只允许事务T读取和修改数据A,其他事务不能对数据A再加任何锁,但可以读。直到事务T释放A上的锁才能
S锁,读锁,共享锁,share locks 用于数据读操作前进行锁定。如果事务T对数据A加上了S锁,事务T就只能读取数据A但不可以修改,其他事务可以再对数据A加S锁执行读取操作,只要数据A上有S锁,任何事物都只能对其加S锁而不能加X锁修改。
网友评论