java 锁表是什么意思_什么情况下行锁变表锁?

在MySql的写语句中,给表列赋值与表类型不符合时,MySql底层的优化器发挥作用,会做一个强制类型转化,此时能正常操作,但会导致行锁升级为表锁。示例如下

以student表为例,表字段类型:

表内容如下:

打开两个session会话窗口,并把两个会话窗口中的MySql的自动提交模式改为手动提交>set autocommit=false;

在会话窗口1中执行更新语句,但不提交事务。age列在建表时指定的是int类型,此地更新语句中用字符串’100’进行赋值,在MySql的优化器中会自动把字符串’100’强制转化为整形100,然后再执行SQL检索。>update student set class=3 where age='100'

然后再会话窗口2中对另外没关系的数据执行更新操作>update student set age=28 where name='lzj';

正常情况下,两条SQL语句操作的行数据不同,执行起来会互不影响,但实际会话1中的更新操作阻塞了会话2中的更新操作

会话1中执行了更新操作,但没有执行事务提交,事务的隔离级别为Read Committed,所以在会话2中还看不到会话1中更新后的结果。但在回话2中执行对其它行数据更新操作时,出现了阻塞。可见会话1中的SQL语句的赋值出现了强转,导致会话1由行锁升级为表锁,锁住了整个student表,因而会话2中的SQL阻塞。下面对会话1中的更新操作执行事务提交,那么会话2中的更新操作就会继续执行了

对会话1中的更新操作执行commit手动提交事务后,会话1释放掉student的表锁,会话2中的更新操作可以继续执行。

最后对会话2中的更新也执行commit事务提交,两条SQL都更新完毕,student表内容如下:

从上述案例观知,SQL语句赋值与表列类型不匹配时,MySql的优化器强制转化为匹配的类型,导致行锁升级为表锁。所以开发中一定要注意类型的匹配,避免行锁升级为表锁,影响并发性能。

猜你喜欢

静态const保留字,是一个类型修饰符,使用const声明的对象不能更新。与final某些类似。

2019-01-16

跳转goto保留关键字,但无任何作用。结构化程序设计完全不需要goto语句即可完成各种流程,而goto语句的使用往往会使程序的可读性降低,所以Java不允许goto跳转。

2019-01-16

无返回值void关键字表示null类型。void可以用作方法的返回类型,以指示该方法不返回值。

2019-01-16

本类this关键字用于引用当前实例。当引用可能不明确时,可以使用this关键字来引用当前的实例。

2019-01-16

父类,超类super关键字用于引用使用该关键字的类的超类。作为独立语句出现的super表示调用超类的构造方法。super.()表示调用超类的

2019-01-16

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值