MySQL入门——事务

事务

事务是指逻辑上的一组操作(可以包含n条sql语句)
如果初学者了解过springboot中的事务注解,请先忘掉那段,单独来看mysql中的这个事务。
事务的流程如下:

  • 开启事务,BEGIN 或 START TRANSACTION 显式地开启一个事务,当然单条的时候默认是隐式开启
  • 提交事务,COMMIT对数据库进行的所有修改成为永久性的
  • [回滚事务],如果sql执行出错会自动回滚事务,使数据还原为事务未开启的状态,当然也可以使用ROLLBACK 语句显示的回滚
start transaction;
insert into ...
commit;

事务的提交模式有两种:自动提交和非自动提交

SET AUTOCOMMIT=0  //禁止自动提交
SET AUTOCOMMIT=1  //开启自动提交

由于事务的提交模式默认是自动提交的,所以在我们执行单条sql时:
1.隐式的开启了事务
2.执行sql语句
3.隐式的自动提交事务
也就是说我们此时执行的每一条sql都是一个事务。

事务的特性
原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

多个事务是允许并行执行的,当他们都操作同一个数据时,就会产生一些问题(比如说A事务获取了数据后,B事务对数据进行了更改,A事务并不知道数据发生了改变,这就会导致一系列的问题产生),如:

  • 脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
  • 丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
  • 不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
  • 幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

说白了,这些都是因为在执行期间B事务对A事务的数据进行了操作导致的
因此,事务的隔离性在此时就显得尤其重要了。
隔离性定义了四个隔离级别,隔离级别是可以自定义设置的,简要了解即可

READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

我们在事务执行时当然要极力避免出现脏读、幻读之类的问题,所以最理想的隔离级别就是“可串行化”,但是这样做的开销却很大。于是,mysql的InnoDB 存储引擎采用“可重复读”的这种隔离级别(仅有可能出现幻读)并以另一种方法(Next-Key Lock 锁算法)解决了幻读问题。这样既解决了所有脏读、幻读等的肯能,又解决了开销问题。
综上,mysql事务的执行得到了完美的保障。

还有一种情况,死锁:两个事务都想获取对方持有的数据,但数据是被对方持有的,只有对方释放资源,才能获取的到,这样的彼此等待对方释放资源,即为死锁。
InnoDB拥有对于死锁的解决方案,他会检测到死锁,然后杀掉其中一个事务,以保证另一个事务的正常执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

缔曦_deacy

码字不易,请多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值