如何编写酒店网站程序以获取开发回扣?
摘要:做网站程序怎么写,酒店网站开发回扣,地址生成器,wordpress 二次元主题一、事务 数据库事务的特性? 数据库事务的四大特性是ACID。 原子性:就是所有操作要么全不做&
做网站程序怎么写,酒店网站开发回扣,地址生成器,wordpress 二次元主题一、事务
数据库事务的特性#xff1f;
数据库事务的四大特性是ACID。
原子性#xff1a;就是所有操作要么全不做#xff0c;要不全做。通过undo日志来实现。一致性#xff1a;就是在并发情况下数据库由一个状态转移到另一个状态的数据要一致。通过事务的隔离级别来实现…一、事务
数据库事务的特性
数据库事务的四大特性是ACID。
原子性就是所有操作要么全不做要不全做。通过undo日志来实现。一致性就是在并发情况下数据库由一个状态转移到另一个状态的数据要一致。通过事务的隔离级别来实现。隔离性多个事务的操作互相不影响数据有4种隔离级别来解决。基于锁mvcc机制来实现。持久性数据库中事务一旦提交数据持久到硬盘中。基于redo日志来实现。
数据不一致的问题
脏读事务A读取一个数据事务B对该数据进行修改修改前后的数据都可以读到但是数据会不一样导致了脏读。脏读强调的是读到其他事务未提交的数据。不可重复读事务A读一个数据事务B对该数据进行修改后提交导致事务A前后读取的数据值不一致。不可重复度强调的是读到其他事务提交后的数据和提交前的数据不一致。幻读事务A读取一个数据事务B在insert、delete增删记录事务A两次读取的数据条数不一致
事务的隔离级别
事务的隔离级别描述的是在多个事务同时运行过程中各自事务中数据的隔离办法事务的隔离级别是为了解决数据库中以上常见的三类问题包括脏读、不可重复读和幻读的问题者四类隔离级别分别为
未提交读事务A可以读到事务B未提交的数据已提交读事务A只能读到事务B提交后的数据可重复读事务A能读取到事务B还未执行完的数据但是读取到的是事务B未开始事务前的数据只有当事务B执行完成了才会读取到新的数据可串形化事务A、事务B的读写操作是串形化的
总结
以上4类隔离级别的约束条件从宽松到严格未提交读隔离级别没有解决任何问题已提交读解决了脏读的问题可重复读解决了不可重复读的问题但还存在幻读的问题但结合MVCC和record lock能解决幻读的问题只有可串形化隔离级别能解决所有数据不一致的问题Mysql的默认隔离级别是可重复读。
mysql如何解决幻读
在快照读情况下即不加锁的非阻塞读像普通select操作下通过mvcc避免幻读通过乐观锁类避免。
对于可重复读的隔离级别下select * from table的语句是采用快照读的模式新的事务会读快照
在当前读情况下当前读表示需要读取当前最新数据是加锁的阻塞读写操作像普通update/insert/delete和加update的select操作是通过next-key lock避免幻读通过悲观锁来避免。
对于可重复读的隔离级别如果是当前读场景需要通过间隙锁(Gap Lock)模式来避免幻读这样行间间距会被加锁不会被新的事务插入新的数据间隙锁加行锁合起来称为next-key lock
二、锁
锁是计算机中协调多线程并发访问共享资源的机制在数据库中就是协调多个事务同时访问同一数据记录的机制在Mysql数据库中进行加锁的对象是索引中的索引项会在索引项上做加锁标记。
锁的分类
mysql数据库的锁分为行锁和表锁。 行锁。是innodb存储引擎的默认加锁方式特点是开销大加锁慢锁力度小所以并发度高适合写多读少场景。 表锁。是myisam存储引擎的默认加锁方式特点是开销小加锁快锁粒度大所以并发度低适合读多写少场景。 记录锁(Record lock)即是行级锁是innodb存储引擎的默认加锁方式。 间隙锁(Gap lock)会对记录之间的左开右闭的区间进行加锁 临键锁Next key Lock记录锁间隙锁统称为临键锁。 共享锁读锁独占锁写锁共享锁又称S锁/读锁对记录进行读操作时进行加的锁可以共享独占锁又称X锁/写锁对记录进行写操作时进行加锁只能独占 意向共享锁意向排它锁为了解决对记录加了共享锁独占锁再对表加表锁的时候需要遍历所以在对行加共享锁独占锁时候会对表加上意向共享锁意向排它锁下次加表锁一目了然这是一类表锁。 插入意向锁就是多个事务在进行插入的时候已经有事务在进行插入操作了另一个在等待的事务需要加上插入意向锁用以表面针对目前的间隙位置有插入的需求
数据库里的乐观锁和悲观锁
所有需要加锁的操作都是在进行多线程情况下才需要的。
乐观锁比较好理解就是预测所有线程对数据的操作都是不会冲突的所以每次对数据进行操作时候都不会加上锁mysql内部机制可以通过mvcc机制来是实现乐观锁悲观锁则相反就是认为每次线程对数据的操作都可能存在冲突所以需要对数据加上行锁、表锁等。mysql主要通过record locknextKey lock来实现。
