数据库的事务我懂了吗(2)

本文深入探讨了基于锁的并发控制方法,包括不同类型的锁(排它锁、共享锁)及其在事务处理中的应用。文章详细解释了四种锁协议(0-lp至3-lp)如何解决丢失修改、脏读、不可重复读等问题,并讨论了锁的粒度选择对并发性能的影响。

基于锁的并发控制方法

  • 锁是处理并发的一种手段。锁是调度器管理和使用的。

  • 0-lp 对写操作上排它锁,写操作结束后立即释放。可以防止丢失修改,允许脏读、不可重复读

  • 1-lp对写操作上排它锁,等事务结束后才释放。可以防止丢失修改、脏读 允许不可重复读错误

  • 2-lp对写操作上排它锁,等事务结束后释放,对读操作上共享锁,读操作完成后释放。防止丢失修改、脏读、不可重复读。这里我始终有个疑问:为什么通过加共享锁就可重复读呢?不可重复读:这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
    一种更易理解的说法是:在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据并修改数据。那么,在第一个事务的两次读数据之间。由于另一个事务的修改,那么第一个事务两次读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。

  • 3-lp对写操作上排它锁,事务结束之后释放锁,对读操作加上共享锁,事务结束之后释放。可以防止所有的不一致。

  • 从上面我们可以看出不同的加锁解锁时机将会解决不同的问题。

  • 封锁粒度:属性->元组->元组集合->关系->DB
    索引项->索引

  • 总结当我们使用封锁协议来解决事务并发时,我们应该考虑加锁的类型、加锁的时机、加锁的粒度、以及涉及到的锁的相容性矩阵。

### 数据库基础与XXL-JOB的关系 MySQL 是一种广泛使用的关系型数据库管理系统(RDBMS),基于 SQL(结构化查询语言)进行数据存储、管理和检索。它以高性能、可靠性和易用性著称,适用于多种应用场景,包括 Web 应用、企业系统和数据分析等。MySQL 支持多种存储引擎、事务处理、复制和集群功能,适用于高并发和大规模数据环境 [^1]。 XXL-JOB 是一个轻量级的分布式任务调度平台,主要用于实现定时任务的统一管理与调度。其核心功能包括任务注册、调度、执行日志记录和失败重试机制等。XXL-JOB 的架构由两个主要组件组成:管理端(xxl-job-admin)和执行端(xxl-job-executor)。管理端负责任务的配置和调度,执行端负责接收调度请求并执行具体任务逻辑 [^1]。 在 XXL-JOB 的实现中,MySQL 被广泛用作其底层数据库,用于存储任务配置、调度日志、执行状态等信息。例如,XXL-JOB 使用 xxl_job_lock 表来实现调度锁,以确保任务调度的原子性和一致性 [^2]。此外,XXL-JOB 的任务执行日志和调度记录也通常存储在 MySQL 数据库中,以便于监控和调试 [^1]。 尽管 XXL-JOB 默认使用 MySQL,但其架构设计允许适配其他数据库。例如,可以通过修改 SQL 语句以兼容人大金仓数据库(KingbaseES),或者引入通用 Mapper 来提升数据库适配性 [^1]。对于 SQLite 这样的嵌入式数据库,也可以通过添加依赖和调整配置实现支持 [^3]。 ### 数据库与 XXL-JOB 的区别 1. **功能定位**: - MySQL 是一个通用的关系型数据库,专注于数据的存储和查询。 - XXL-JOB 是一个任务调度框架,专注于任务的管理和执行 。 2. **数据模型**: - MySQL 提供了完整的 SQL 支持,包括事务、索引、视图和存储过程等。 - XXL-JOB 的数据模型较为简单,主要涉及任务配置、执行日志和调度状态等表结构 [^1]。 3. **部署方式**: - MySQL 通常作为独立的数据库服务部署,支持多客户端连接。 - XXL-JOB 通常部署为 Web 应用(管理端)和微服务(执行端),依赖数据库进行任务管理 [^1]。 4. **适用场景**: - MySQL 适用于需要持久化存储和复杂查询的场景。 - XXL-JOB 适用于需要定时任务调度和分布式任务执行的场景 [^1]。 ### 数据库与 XXL-JOB 的联系 1. **依赖关系**: - XXL-JOB 的运行依赖于数据库,通常使用 MySQL 作为默认存储引擎。 - XXL-JOB 通过数据库存储任务配置、执行日志和调度状态等信息 [^1]。 2. **扩展性**: - XXL-JOB 支持通过 SQL 改造和通用 Mapper 实现数据库适配,例如支持人大金仓或 SQLite [^2][^3]。 3. **事务控制**: - XXL-JOB 利用数据库事务特性确保任务调度的原子性和一致性。例如,通过 xxl_job_lock 表实现调度锁 [^2]。 ### 示例代码:XXL-JOB 的调度锁实现 ```java // 获取数据库连接 Connection conn = dataSource.getConnection(); // 执行 SQL 查询并加锁 PreparedStatement preparedStatement = conn.prepareStatement("SELECT * FROM xxl_job.xxl_job_lock WHERE lock_name = 'schedule_lock' FOR UPDATE"); ResultSet resultSet = preparedStatement.executeQuery(); ``` 上述代码展示了 XXL-JOB 在 MySQL 中如何实现调度锁,确保任务调度的并发控制 [^2]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值