高性能Mysql学习日志之事务脏读、不可重复读、幻读原理以及排它锁共享锁结合事务的原理解析(二)

1.3事务

一个运行良好的事务所必须具备的标准特征:原子性、一致性、隔离性、持久性。

1.3.1事务隔离级别

Read UnCommitted(未提交读) :

指对于一个事务,它即使还没commit,但是他的部分内容却已经被其他事务所看见,即脏读。例如:当你对A表、B表、C表进行一个事务的更新操作。当A表更新完成,B表、C表还没更新,这时候来了另一个事务对A表和B表进行查询操作,此时他能看到A表更新后的内容和B表未更新的内容。这是一个很致命的问题。)

Read Committed(读已提交):

指对于一个事务,只能查询到已经提交的事务所做的修改。但是这会出现不可重复读的问题。例如:当你执行一个事务X对A表进行查询5条数据的操作,然后另一个事务Y提交了对5条数据中的某一条数据的更新,这时候你在事务X中又对A表进行5条数据的查询时,你会发现数据跟之前的数据不一样了。(大部分的数据库都是默认使用这个隔离级别,但是mysql不是。)

Repeatble Read(可重复读)

这个隔离级别解决了脏读和不可重复读的问题,保证在同一个事务中多次读取相同记录的结果是一样的。但是还会有幻读的问题存在。例如:一个事务X对A表进行某个范围的查询,然后另一个事务Y插入了一条数据B,这时候,事务X又对A表想进行插入数据B的操作,此时会发现数据B已经存在数据库中,插入失败;(或者事务X又对A表想进行查询数据的操作,此时会发现突然多出来一条数据B)(可重复读比读已提交好的地方其实就在于他防止了更新操作,但是还是存在插入和删除操作的问题)。

Serializable可串行

这个隔离级别是最严格的隔离级别,但是也是效率最低的食物操作,它通过强制事务串行执行来避免上面的所有问题。

(扩展:

不可重复读的锁原理:当事务A对某条数据A存在一个共享锁时,事务B的一个排它锁排在了事务A的另一个共享锁之前,它先进入了数据A,当该排它锁释放锁后,事务A的另一个共享锁才再次进入数据A。此时就出现了不可重复读的现象。

幻读的锁原理:当事务A对某条数据A存在一个共享锁后,事务B的一个排它锁排在了事务A的一个排它锁之前,事务B的排它锁先进入了数据A,当该排它锁释放锁后,事务A的排它锁才再次进入数据A。就出现了幻读的现象。

1.3.2死锁

死锁指的是两个或多个事务在同一个资源上互相占用,请求锁定对方占用的资源,导致程序卡死。例如:

事务1进行对一条数据A的更新操作,然后进行对一条数据B的更新操作。事务2进行对一条数据B的更新操作,然后进行对一条数据A的更新操作。当事务1执行完成数据A的更新操作的同时,事务2执行完成数据B的更新操作,此时两个事务都尝试执行第二条更新操作,但是发现该行数据被对方锁死,此时就产生了死锁。

那么如何解决死锁呢?数据库系统实现了对各种死锁的锁检测,以及对死锁超时机制。目前InnerDB数据库引擎的做法是,当锁超时时,将会对持有最少行级排它锁的事务进行回滚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值