MySql的事务和隔离级别

MySql的事务和隔离级别

1. 事务

1.1 原子性
事务包含的一系列操作要么全部成功要么全部回滚,不存在部分成功或者部分部分回滚,是一个不可分割的整体;
1.2 一致性
可以理解为事务对数据完整性的约束,包括主键约束,唯一索引约束,外键约束等;事务执行前后,数据都是合法的,不能违背任何的数据完整性;可以理解为一致性就是为了包证数据的完整性;
1.3 隔离性
当多个用户并发操作数据库,数据库会为每一个用户开启事务,事务之间不会相互影响,彼此独立;
1.4 持久性
当事务一旦提交,那么数据库中的数据改变是永久的,即使数据库发生故障也不会丢失事务提交的数据;

2. 事务的并发问题

2.1 脏读:一个事务在处理过程中读取了另一个事务未提交的数据;
2.2 不可重复读:事务A在反复读取数据的过程中对数据进行了更新,与此同时,事务B也在反复读取此数据,导致事务B多次读到的数据不一样,结果不一致;
2.3 幻读:系统管理员A将学生的分数改为ABCED等级,此时,管理员B插入了一条数据为学生的分数,当管理员A再次查看时,发现有记录没有修改过来,就像产生了幻觉一样。
注意: 不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

3. 事务的隔离级别

在这里插入图片描述
Serializable (串行化):可避免脏读、不可重复读、幻读的发生
Repeatable read (可重复读):可避免脏读、不可重复读的发生
Read committed (读已提交):可避免脏读的发生
Read uncommitted (读未提交):最低级别,任何情况都无法保证

4. 并发事务的丢失更新以及处理方式

4.1 丢失更新
当两个事物或多个事务都更新了同一条数据,但是这些事务彼此之间都不知道其他事务进行的修改,因此第二个更改覆盖了第一次的更改,即事务A还没有提交之后,但此时事务B更新了数据,那么事务A就丢失更新了。
4.2 解决方案
悲观锁和乐观锁;
悲观锁: 数据库的一种锁机制,悲观锁分成两种,分别是共享锁和排它锁;
共享锁: 例如 我在客户端A 给数据C 添加了共享锁,此时我在客户端B只能添加共享锁进行查看,没有修改的权利,如果我想要在客户端B进行修改,我只能在A处commit才能进行修改。
排它锁: 我在客户端A 给数据C添加了排它锁,那么我在客户端B只能在客户端 A commit之后,才能select数据。这个排它锁很像数据库隔离级别中的最高的隔离级别。

添加共享锁方式:select * from account lock in share mode ;
添加排它锁方式:select * from account for update;

乐观锁: 假设丢失更新不存在,它使用的是数据库的字段进行加测。 例如我在我的字段中添加一个字段,字段的类型是 timestamp 在插入和修改时,都会自动更新为当前时间 ,我根据sql条件进行判断,如果我的时间不符合,那么我的跟新失败。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值