mysql数据库学习(keep update)

[html]  view plain  copy
    1. mysql:开源(开放源码,免费) 分为社区版/企业版
    2. 如果你学习过oracle,基本的crud语句差别不大

[html]  view plain  copy
  1. :mysql的基本使用:(-u:用户名 -p:,密码)
[html]  view plain  copy
  1. ②:mysql与oracle的区别?

[html]  view plain  copy
  1. 1.  mysql:管理方式:

    有数据库的概念,使用不同的数据库进行管理表

    创建数据库:create database数据库名称

    使用数据库(进入某个数据库中)use数据库名称

    进入数据库中之后,才可以创建和操作table

    2.  数据类型:

    intinteger

    varchar没有varchar2

    double

    3.创建table(主键生成方式)

    createtable user(

    idinteger(32) auto_increment primary key,

    namevarchar(12)

    )

    使用(针对主键(自增长/sequence序列)和插入语句)

    由于mysql是有主键自增长策略的,所以在插入数据的时候,不用插入id(主键)

    4.数据库分页规范:

    select *from user limit偏移量,每页显示条数; 偏移量计算:当前页(pageIndex-1)*每页显示条数=每页第一条数据的id

  2. 5.判null函数IFNULL(param1,param2)

[html]  view plain  copy
  1. 1.  oracle:管理方式:

    没有数据库的概念,使用不同的用户(root/hr)进行管理表

    数据类型:

    没有number

    varcharvarchar2(常用,效率高)都有

    number(12,2)

    2.  创建table(主键生成方式)

    createtable user(

    idnumber(32) primary key,

    namevarchar2(12)

    )

    使用(针对主键(自增长/sequence序列)和插入语句)

    由于oracle没有主键自增长策略,所以在插入数据的时候,需要sequence序列(主键)

    3.数据库分页:

    三层/两层自查询嵌套

  2. 4.判null函数:nvl(param1,param2)


[html]  view plain  copy
  1. oracle:
    <property name="driver" value="oracle.jdbc.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
    <property name="username" value="hr"/>
    <property name="password" value="hr"/>

  2. mysql:
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/数据库名称"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>

  3. public List<User> queryUserByPage(@Param("pageIndex")Integer pageIndex,@Param("pageSize")Integer pageSize);


    <select id="queryUserByPage" resultType="User">
    select * from user limit ${(pageIndex-1)*3},3
    </select>

<think>好的,我现在要详细解释MySQL的可重复读隔离级别。首先,我需要确认可重复读的定义,根据引用[1],它确保在同一个事务中多次读取的数据是一致的,不会被其他事务的提交影响。这说明可重复读通过快照读来实现一致性,但可能有幻读的问题。 接下来,要讲工作原理。引用[1]提到快照读依赖MVCC,而当前读需要其他机制。MVCC如何工作呢?应该解释版本号和Undo Log,确保事务看到一致的数据快照。同时,引用[2]说明悲观锁如行锁不能防止幻读,所以需要间隙锁。这里需要详细说明间隙锁的作用,如何阻止其他事务插入新数据到范围内。 然后,幻读的问题。引用[3]的例子很好,可以引用来说明幻读现象,以及可重复读如何通过间隙锁来防止。需要区分快照读和当前读的不同处理方式,快照读用MVCC避免幻读,当前读用间隙锁。 最后,应用场景和限制。根据引用[1],可重复读适用于需要事务内一致性的场景,但需要注意锁的机制带来的性能影响。可能还需要对比其他隔离级别,比如读已提交,来突出可重复读的特点。 现在需要确保LaTeX格式正确,行内公式用$...$,独立公式用$$...$$。例如,解释版本号时可以用$version$变量,或者举一个数据行的例子。但用户的问题主要是数据库相关,可能数学公式较少,但如果有涉及计算的地方要正确应用格式。 另外,生成相关问题时要围绕可重复读、MVCC、间隙锁、幻读等关键词,确保问题有针对性。例如,如何配置隔离级别,MVCC工作原理,间隙锁如何防止幻读等。 检查引用是否正确,每个引用对应的内容是否准确。引用[1]提到快照读和当前读的不同解决方案,引用[2]讨论锁机制,引用[3]定义幻读。这些都需要在回答中正确引用,例如在解释间隙锁时引用[2],在讨论幻读例子时引用[3]。 可能的结构: 1. 定义 2. 工作原理(MVCC和间隙锁) 3. 幻读问题及解决方案 4. 应用场景和限制 确保每个部分都自然引用相关文献,并在末尾添加引用标识。例如,在讲MVCC时引用[^1],讲间隙锁时引用[^2],举例幻读时引用[^3]。 最后,检查语言是否通顺,符合中文表达,避免技术术语错误,比如“事务”而不是“事物”。</think>### MySQL 可重复读隔离级别详解 #### 1. 定义与核心特性 **可重复读(Repeatable Read, RR)** 是MySQL的默认事务隔离级别,其核心特性是: - 事务内多次读取同一范围的数据时,结果始终一致,不受其他事务提交的影响 - 通过**快照读**(基于MVCC)实现数据一致性 - 通过**间隙锁**(Gap Lock)解决当前读的幻读问题 #### 2. 工作原理 **1. MVCC(多版本并发控制)** - 每个事务启动时生成唯一的事务ID(`$tx\_id$`) - 数据行通过隐藏字段 `$DB\_TRX\_ID$` 记录修改该行的事务ID - 通过 **Undo Log** 链实现版本回溯,确保事务只能看到早于其 `$tx\_id$` 或自身修改的数据版本 例如: ```sql -- 事务A查询id=10的数据时,实际访问的是对应Undo Log中的历史版本 SELECT * FROM table WHERE id = 10; -- 快照读 ``` **2. 间隙锁(Gap Lock)** - 针对**当前读**(如 `SELECT ... FOR UPDATE`)场景 - 锁住索引记录之间的“间隙”,阻止其他事务插入新数据 - 例如执行 `SELECT * FROM table WHERE id BETWEEN 10 AND 20 FOR UPDATE` 时,会锁住区间(10,20),阻止插入id=15的记录[^2] #### 3. 幻读问题与解决方案 **幻读现象**(引用示例[^3]): ```sql -- 事务C第一次查询 SELECT * FROM users WHERE id > 10 AND id < 20; -- 返回5条记录 -- 事务D插入id=15的新数据并提交 -- 事务C再次查询(当前读) SELECT * FROM users WHERE id > 10 AND id < 20 FOR UPDATE; -- 返回6条记录 ``` **解决方案**: - **快照读**:通过MVCC返回事务开始时的数据版本,避免看到新插入的数据[^1] - **当前读**:通过间隙锁封锁范围,阻止其他事务插入新数据[^2] #### 4. 应用场景与限制 **适用场景**: - 需要事务内多次查询结果一致的场景(如对账、统计) - 需要同时保证数据可见性和部分写冲突控制的场景 **限制**: - 间隙锁可能降低并发性能 - 不适用于需要实时读取最新数据的场景 $$ \text{隔离级别对比公式:} \\ \text{可重复读} \subset \text{隔离级别} \subseteq \\{\text{读未提交}, \text{读已提交}, \text{可重复读}, \text{串行化}\\} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值