mysql创建读写锁命令_MySQL源代码:如何对读写锁进行处理

看起来实际的加锁和解锁操作是通过对计数器来控制的,

(1)在函数rw_lock_s_lock_low中

rw_lock_lock_word_decr (lock, 1),对lock->lock_word减去1

减数成功返回true,否则返回false

这部分的逻辑还是很简单的。

(2)在函数rw_lock_x_lock_low中,调用:

rw_lock_lock_word_decr(lock, X_LOCK_DECR),对lock->lock_word减去X_LOCK_DECR

减数成功后,执行:

[cpp]

rw_lock_set_writer_id_and_recursion_flag(lock,pass ? FALSE : TRUE)来设置:

lock->writer_thread = s_thread_get_curr_id()

lock->recursive = TRUE然后调用rw_lock_x_lock_wait函数等待lock->lock_word=0,也就是说等待所有的读锁退出。

看到一个比较有意思的现象,在.ic的代码里看到使用了宏

INNODB_RW_LOCKS_USE_ATOMICS,这是跟gcc的版本相关的,通过使用gcc的内建函数来实现原子操作。

3.解锁

解锁操作包括解除读锁(#define rw_lock_s_unlock(L) rw_lock_s_unlock_gen(L, 0))和解除写锁操作(#definerw_lock_x_unlock(L) rw_lock_x_unlock_gen(L, 0))

实际调用函数为rw_lock_s_unlock_func和rw_lock_x_unlock_func

1)解除读锁(rw_lock_s_unlock_func)

增加计数rw_lock_lock_word_incr(lock, 1)

2)解除写锁(rw_lock_x_unlock_func)

执行如下操作

(1)如果是最后一个递归调用锁的线程,设置lock->recursive= FALSE; 代码里的注释如下:

[cpp]

/* lock->recursive flag also indicatesif lock->writer_thread is

valid or stale. If we are the last of the recursive callers

then we must unset lock->recursive flag to indicate that the

lock->writer_thread is now stale.

Note that since we still hold the x-lock we can safely read the

lock_word. */(2)增加计数rw_lock_lock_word_incr(lock,X_LOCK_DECR) == X_LOCK_DECR,这时候需要向等待锁的线程发送信号:

[cpp]

if(lock->waiters) {

rw_lock_reset_waiter_flag(lock);

os_event_set(lock->event);

sync_array_object_signalled(sync_primary_wait_array);

}os_event_set函数会发送一个pthread_cond_broadcast给等待的线程 0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用Spring Boot和MySQL实现读写分离的具体步骤是:1. 在application.properties文件中指定主从数据库连接信息,并设置负载均衡策略;2. 在 Spring Boot 启动类中添加@EnableRoutingDataSource注解;3. 创建表以及存储过程,以便读取数据库;4. 在DAO层中根据注解读写分离;5. 在Service层中添加事务支持。使用Java代码实现读写分离,可以使用Spring Boot提供的@Transactional注解,将DAO层和Service层的数据操作标记为@Transactional,并在application.properties文件中设置spring.datasource.readOnly=true,以便将所有数据库操作都路由到读库,实现读写分离。 ### 回答2: Spring Boot结合MySQL实现读写分离的详细步骤如下: 1. 配置MySQL主从复制:在MySQL数据库中设置主数据库和多个从数据库,并确保主数据库的数据能够实时同步到从数据库。 2. 在Spring Boot项目中引入相应的依赖:在pom.xml文件中添加MySQL驱动和Spring Data JPA的依赖。 3. 创建数据源配置类:创建一个用于主从数据库配置的类,可以使用@Configuration注解标记,使用@Bean注解定义数据源和事务管理器。 4. 创建读写分离的数据源路由器:通过继承AbstractRoutingDataSource类,实现determineCurrentLookupKey()方法,根据具体的业务逻辑选择要使用的数据源(Master或Slave)。 5. 配置读写分离的数据源:在配置文件(application.properties或application.yml)中配置主从数据库的连接信息,并设置使用的数据源为读写分离的数据源路由器。 6. 创建实体类和DAO接口:在项目中定义实体类和DAO接口,使用Spring Data JPA提供的注解和方法来实现对数据库的操作。 7. 创建Service和Controller类:创建业务逻辑处理的Service类和Web请求处理的Controller类,使用@Autowired注解将DAO接口注入到Service类中,然后在Service类中进行业务逻辑的处理。 8. 编写测试代码:可以使用JUnit等测试框架编写测试用例,测试读写分离是否正常工作。 通过以上步骤,就可以实现Spring Boot结合MySQL实现读写分离的功能。可以根据具体的业务需求来选择使用的读写分离方案,并进行相应的配置和测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值