mysql数据库的事务技术以及原理

事务的基本概念

一个事务要么成功要么失败,不能有中间状态(原子性);一个事务一旦完成,后面的事务都要基于这个完成后的状态(一致性);未完成的实务不会相互影响,事务的中间状态不会被其他的事务感知到(隔离性);事务一旦完成就是持久的。(持久性)

事务操作可能导致的问题

1)脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。

2)不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时结果不一致。

3)幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A修改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

事务的隔离级别

未提交读:最低的隔离级别,事务执行过程中,对其他事务是可见的,事务A可以读取到事务B未提交的数据。

提交读:保证一个事务提交之后,其他事务才能读取该事务中修改的数据。比如A要读B中修改的某个数据,只能等B提交完成后才能读取。这样就避免了脏读的问题。但会出现不可重复读以及幻读的问题。

可重复读:读取数据的事务,会禁止其他事务对正在读取事务的修改。(加上了读写锁)

可串行化:在这种隔离级别下,读取的每行数据都加锁,会导致大量的锁征用问题,性能最差。

mysql的默认隔离级别是可重复读,可重复读会导致的幻读问题,但是在InnoDB中,有间隙锁可以解决这个问题。

间隙锁解决幻读问题

间隙锁:是innodb中行锁的一种, 但是这种锁锁住的却不止一行数据,他锁住的是多行,是一个数据范围,间隙锁的主要作用是为了防止出现幻读。

事务的具体实现

事务的隔离性是通过锁和MVCC实现,事务的原子性、一致性和持久性则是通过事务日志实现。

锁机制主要解决写-写冲突问题。在读取数据前,对其加锁,防止其它事务对该数据进行修改。分为悲观锁和乐观锁。悲观锁依靠数据库提供的锁机制,比如innoDB的行锁表所,myISAM的表锁。乐观锁大多是基于数据版本记录机制来实现。

MVCC多版本并发控制

解决读-写冲突问题。不用加锁,通过一定机制生成一个数据请求时间点时的一致性数据快照, 并用这个快照来提供一定级别 (语句级或事务级) 的一致性读取。这样在读操作的时候不需要阻塞写操作,写操作时不需要阻塞读操作。

当一个使用了 MVCC 的数据库需要更一条数据记录的时候,不会直接用新数据覆盖旧数据,而是将旧数据标记为过时的(一般使用时间戳或者事务 ID去标记当前读的数据库的状态),然后在别处增加新版本的数据。这样会有存储多个版本的数据,但是只有一个是最新的。这种方式允许读线程继续读取之前的数据,即使这些在读的过程中半路被别人修改、删除了也对先前正在读的用户没有影响。这种多版本的方式避免了填充删除操作在内存和磁盘存储结构造成的空洞的开销,但是需要系统周期性整理(sweep through)以真实删除老的、过时的数据。

在innoDB的存储引擎中,事务日志通过重做(redo)日志和innoDB存储引擎的日志缓冲(InnoDB Log Buffer)实现。事务开启时,事务中的操作,都会先写入存储引擎的日志缓冲中,在事务提交之前,这些缓冲的日志都需要提前刷新到磁盘上持久化。当事务提交之后,数据文件才会慢慢刷新到磁盘。此时如果数据库崩溃或者宕机,那么当系统重启进行恢复时,就可以根据redo log中记录的日志,把数据库恢复到崩溃前的一个状态。未完成的事务,可以继续提交,也可以选择回滚。

undo log主要是做事务回滚的。undo log记录了数据在每个操作前的状态,如果事务执行过程中需要回滚,就可以根据undo log进行回滚操作。

意向锁的作用

在获取表锁的时候,可能会出现表中某个数据被加锁,这时需要对表中数据做一次遍历,查询是否有被加锁的数据。这会导致效率大量降低。这个时候意向锁就发挥作用了。

每次在对行加锁之前,要先取得表的意向锁,其他事务对行加锁是,不会受到意向锁的影响。但是要获得表锁,就必须现获取到表的意向锁,这就省去了大量的查询表中是否有行锁的时间。

共享锁与排他锁

共享锁加上后,运行其他共享锁共享资源,但不允许排它锁加入。排它锁加上后,不允许其他任何锁加入。

一个数据能加很多S锁,但只能加一个X锁。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值