1
a7a2 2018-07-11 10:42:00 +08:00
你对事务 理解可能有点错误。。。
|
2
letitbesqzr OP @a7a2 #1 应该没问题吧,我只是举例 事务 a 里 还有很多其他 sql,只是简单举例说了下
|
3
rodericliu 2018-07-11 11:19:22 +08:00
这个还真不是事务,这个只是 MYSQL 的表锁,如果你采用的 MyISAM 引擎,如果是写操作,那么会全表锁,也就是只能等你 a 执行完了,表锁才释放,b 才能继续执行;如果是 InnoDB 引擎,因为是行级锁,就不会有这个问题。
|
4
letitbesqzr OP @rodericliu #3 是 InnoDB 引擎。这样的确会锁上,
|
5
HypoChen 2018-07-11 11:27:22 +08:00
参考事务隔离级别:
==================================================================================== 隔离级别 脏读( Dirty Read ) 不可重复读( NonRepeatable Read ) 幻读( Phantom Read ) ==================================================================================== 未提交读( Read uncommitted ) 可能 可能 可能 已提交读( Read committed ) 不可能 可能 可能 可重复读( Repeatable read ) 不可能 不可能 可能 可串行化( Serializable ) 不可能 不可能 不可能 ==================================================================================== |
6
letitbesqzr OP @HypoChen #5 使用的 rr,事务 a 在修改的时候不允许其他事务再去读?像这样的语句 insert into herbal ('medicine') values (1) 关联使用了他,而没去查询他,也算是读?也会锁等待?
|
7
zjp 2018-07-11 11:44:38 +08:00 via Android
herbal 表外键到 medicine,插入时要检查 medicine 存不存在对应的记录,这不是读了吗?一致性要求不高的话用读已提交
|
8
letitbesqzr OP @zjp #7 的确是这样,感谢,了解了,我换 rc 吧。
|
9
letitbesqzr OP |
10
letitbesqzr OP |
11
zjp 2018-07-11 14:29:05 +08:00 via Android
@letitbesqzr 没说用读已提交能避免锁啊,只是减小冲突率。事务结束时一次性提交的话可重复读和已提交读没区别。
|
12
letitbesqzr OP @zjp #11 那像这种情况,只能不去使用外键了?因为就如上 excel 的 session1 和 session2 就算同时在不同事务中执行,也不会造成什么影响吧。
|
13
zjp 2018-07-11 14:38:55 +08:00 via Android
不清楚你的需要…应用层保证数据一致也可以
|
14
letitbesqzr OP @zjp 就比如是购物网站,后台正在修改商品 A 的库存数量,但是修改库存数量这个事务在没提交的时候,用户就无法进行购买操作,因为订单数据表里会一个外键字段关联到商品表。
|
15
saltxy 2018-07-11 15:52:08 +08:00
@letitbesqzr 这很正常呀,要是修改库存事务没提交,另外一个用户就购买成功了,不就会出现超卖了吗
|