MYSQL事务小知识

一、什么是事务?
事务就是一组操作,要么全执行,要么全不执行。

比如说我张三要去银行转账给李四,转账无非就是两种情况:成功和失败,如果成功都还好,但是失败后就需要把钱返回到张三的银行卡中,就是说失败张三的卡里面的钱不会被扣,而李四卡里面的钱也不会多。这些操作必须是同时执行,要么全部成功,要的全部失败。

二、事务的特性(ACID)
原子性:事务最小的执行单位,不允许分割。事务的原子性确保动作要么全部执行,要么全部不执行。
一致性:执行事务的前后,数据保持一致。例如转账的业务中,无论事务是否成功,转账者和收款人的总额应该是不变的。
隔离性:并发访问数据库时,一个用户的事务不应该被其他事务所影响,各并发事务之间数据库是独立的。
持久性:一个事务被提交后,它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有影响。

三,事务的使用:在类或者方法上加注释:

@Transactional,使用枚举定义事务的传播类型

比如:

Propagation.后面跟的时事务传播类型:

1.SUPPORTS :支持当前事务,当前当前没有事务,就不加事务;
2.REQUIRED :支持当前事务,如果当前没有事务,则新建一个事务;
3.REQUIRES_NEW :新建事务,如果当前有事务,则把事务挂起;

4.NEVER : 不支持事务,如果当前有事务,则抛出异常;

5. NOT_SUPPORTED:始终以非事务方法执行,如果当前存在事务,将事务挂起;

6.NEVER :不使用事务,存在事务,抛出异常;

7.NESTED: 如果当前事务存在,则在嵌套事务中执行,否则和REQUIRED一样;

 

四、事务机制
1.脏读(Dirty Read)
        在事务A执行的过程中,发生了更改(update),事务B读取了A未提交的数据;此刻,事务A因为某些原因发生回滚Rollback,事务B读取的数据就是脏数据。

2.不可重复读(Nonrepeatable Read)
        事务B读取了2次数据,2次结果是不一样,在读取两次的过程中事务A发生了修改,导致读取出来的数据不一致,同一个事务中,读取两次的结果是不一样的就是不可重复读。

3.幻读
        事务B前后两次读取同一个范围的数据,在事务B读取的过程中A增加了数据,导致B后一次读取查询中之前没有的行;
和不可重复读有些类似,幻读强调的是事务A增加的记录,不可重复读强调的是修改的数据。

4.第一类更新丢失
        事务A和事务B都对数据进行更新,A发生异常,进行回滚,把B提交的事务覆盖了。

5.第二类更新丢失
        事务A和事务B都对数据进行更新,事务A把事务B的更新数据的给覆盖了

五、事务隔离级别:
        主流的关系型数据库,事务的隔离级别从低到高:读为提交,读已提交,可重复读,串行化;隔离级别设定越高,越能保持数据的一致性,执行效率就越低,mysql默认是可重复读

1,读未提交:最低的事务隔离级别,只能解决第一类数据更新丢失;

2,读已提交:可以防止脏读和第一类数据丢失;

3,可重复读:一个事务多次读同一个数据,没有结束时,其他事务不能访问该数据,可能会出现幻读;

4,串行化:事务一个一个执行,大量超时现象和锁竞争;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值