SQL(持续更新)

2024/ 09/ 04

mysql的事务隔离级别

1. read uncommotted(读未提交)

这个是最低的隔离级别。在这个级别下,一个事务可以读取到另一个事务未提交的数据。这会导致脏读,不可重复读,幻读。脏读( Drity Read): 某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个事务RollBack了操作,则后个事务所读取的数据就会是不正确的。

2. read committed(读已提交)

在这个级别下,一个事务只能读取到另一个事务已经提交的数据。这可以避免脏读,但仍然会导致不可重复度,幻读。不可重复读(Non- repeatable read): 在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了个事务更新的原有的数据。

3. repeatable read(可重复读)

mysql默认的隔离级别。在这个级别下,一个事务在整个过程中多次读取同样记录的结果是一致的,即使其他事务对这些记录进行了更新并提交。但仍然存在幻读。幻读( Phantom Read): 在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(RoW)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

4. serializable(可串行化)

这是最高的隔离级别。它通过强制事务串行执行,避免脏读,不可重复读,幻读。但是执行效率最低。

Mybatis的嵌套查询

今天学到了Mybatis的嵌套查询:

resultMap中定义了collection标签,collection标注中用到select关键字

collection标签中使用了select属性时,这通常意味着MyBatis将执行一个单独的查询来填充集合中的每个元素,而不是通过单个查询直接获取所有数据。这种技术被称为“嵌套查询”(Nested Select)。

<resultMap id="userResultMap" type="com.example.User">  
    <id property="id" column="user_id" />  
    <result property="username" column="username" />  
    <collection property="addresses" ofType="com.example.Address"  
                select="findAddressesByUserId" column="user_id" />  
</resultMap>  
  
  
<select id="findAddressesByUserId" resultType="com.example.Address">  
    SELECT address_id, street, city, state FROM addresses WHERE user_id = #{userId}  
</select>

 虽然这种方法(嵌套查询)在逻辑上很清晰,但它可能会导致N+1查询问题,即如果查询出N个用户,那么就会执行N+1次数据库查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值