mybatis mysql 锁_mysql 表读锁、表写锁、行锁以及mybatis中实现行写锁

MYSQL的表级锁的锁模式

表共享锁(表读锁):持有表A读锁的session可以读表A,但不能更新表A,同时不能对其他表进行任何查询、更新操作。

其他session可以读取表A,但是不能更新表A。

表排他锁(表写锁):拥有表A写锁的session,可以对表A进行查询、更新操作。同时具有排他性,其他session不能对表A进行查询、更新操作。

如何加表锁:

锁定表:LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},…]

0c32dfa3d0908007ba9d18aab88bb7d1.png

解锁表:UNLOCK TABLES

表解锁前,其他窗口可以查询表b_incr,不能修改表数据。

6910036e3290115bdb4b598ea732e00f.png

对表加写锁、解锁:

417353aa990ebc0cacea3cc43b477c07.png

MYSQL:InnoDB的行锁模式及加锁方法

共享锁:允许一个事务度一行,阻止其他事务获取相同数据集的排他锁。

SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE

排他锁:允许获取排他锁的事务更新数据,阻止其他事务获取相同的数据集共享读锁和排他写锁。

SELECT * FROM table_name WHERE ... FOR UPDATE

InnoDB行锁实现方式

InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!。

------------------------------------------------------------------------------------------------

下面是在MyBatis中如何实现行级锁。

1.首先需要在使用行级锁的实现层(ServiceImpl)加上事务,

serviceImple层:使用for update 一定要在方法上加上@Transactional(isolation = Isolation.READ_COMMITTED),当事务处理完后,for update 才会将行级锁解除。

425bd0ad450d66002332ea03e46a9a9b.png

执行此方法时进行加锁,当整个方法将事务提交后,才会解锁。

110b8e0e307c5562cfa959d9847cea0d.png

2.Mapper,SQL使用for update 加行锁。

bdda373100ebe50127d25b2ff235bb55.png

经测试运行无误。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot使用MyBatis操作MySQL时,可能会遇到的情况。是指在数据库操作期间,某个被其他事务或线程定,导致当前事务无法访问或修改该的数据。 要解决这个问题,可以考虑以下几个方面: 1. 事务隔离级别:通过设置事务的隔离级别来控制并发访问数据库时的为。在Spring Boot,默认的事务隔离级别是READ_COMMITTED,可以根据实际需求调整为其他级别,如REPEATABLE_READ或SERIALIZABLE。 ```java @Transactional(isolation = Isolation.REPEATABLE_READ) public void myMethod() { // 业务逻辑 } ``` 2. 并发控制:使用数据库的并发控制机制来避免或减少情况的发生。例如,在MyBatis可以使用乐观或悲观实现并发控制。乐观通过版本号或时间戳等机制来判断数据是否被修改,而悲观则是在访问数据之前就将其定,直到事务完成为止。 3. SQL优化:通过对SQL语句进优化,减少对同一数据资源的并发访问,从而减少的可能性。例如,避免不必要的全扫描、减少事务的持有时间等。 4. 分分库:如果系统某个的并发访问频率非常高,可以考虑将其进或分库处理,将数据分散到多个物理存储,从而提高系统的并发性能。 需要注意的是,是一个复杂的问题,具体的解决方案需要根据实际情况进调整和优化。以上只是一些常见的方法,具体的解决方案还需要结合业务场景和实际需求来确定。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值