数据库锁;数据库隔离级别;spring事物传播行为;锁

1.锁与事物

        锁:在多线程开发中 锁是并发控制的一种方案

        事物:事物保证 一组操作同时成功 或同时失败(原子性),当发生异常时会回滚到修改之前的状态(一致性 ),原子性和一致性 可以有undo redo日志实现。在两个事物并发执行时 提供可选的读取数据的方式(隔离性),以及(持久性) 。注意事物不是某一个特征的特指 而是要同时满足以上4者 。

2.mysql InnoDB数据库并发控制机制:行级读锁,行级写锁,表级读锁,表级写锁等。

 详情见:https://draveness.me/mysql-innodb

3.数据库隔离级别与spring事物传播行为

        数据库隔离级别:在两个事物同时进行时,用来约束同时进行的两个事物,对临界区数据的读的限制方案。

       spring事物传播行为:启用了事物的方法中,调用启用了事物的其他方法时,对这两个涉及到的事物 重新给一个事物的定义方案。

4.Spring并不直接管理实务,而是提供了多种事物管理器,Spring将事物管理的职责委托给Hibernate或者JDBC,JTA等持久化机制相关平台框架的事物来实现。

4.加锁 数据库的隔离级别 使用各种数据库锁实现

5.对于数据库的同一条数据  两个线程并行执行 取-->修改-->存这样一组操作 ,实现这个操作是线程安全的 2种方案a,b 和 不安全的方案c

    a.使用synchronized lock 使这一组操作只能线性执行 ,来保证线程安全,可并不保证这一组操作会同时成功。

    b.查询使用数据库的select for update 使用行级锁 读取的时候锁住数据

    c.开启事物 将取-->修改-->存这样一组操作放到一个事物中,使用数据库默认隔离级别(Repeatable read) 保证对临界区数据的读的限制方案。以a,b两个线程 并发执行这个事物为例,假设当前读取值是m=1,那么 a,b线程都会读取到1。若b将取出的值m改为3并提交,此隔离级别保证了a线程在当前事物中,不会读取到b线程已经提交的值3,a线程仍然会读取到a事物开始时读取到的值1,只是在a线程执行m++并提交时,a存入m当前的值1加一后的值为2,数据库最终存入m=2。 所以事物不能保证这组操作的线程安全,事物是为了一组操作一起成功一起失败为目标,当发生异常时会回滚到修改之前的状态,更适合转账这样的复合修改(写)操作,能保证a扣钱和b加钱同时成功 。

注:事物隔离级别理解 《从Paxos到Zookeeper:分布式一致性原理与实践》一书中1.21ACID讲解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值