网站首页 > 文章中心 > 其它

mysql锁表怎么用

作者:小编 更新时间:2023-10-23 13:08:51 浏览量:4人看过

java程序中如何实现对mysql数据库中表的锁定

方法1:用mysql命令锁住表.

public?void?test()?{?

String?sql?=?"lock?tables?aa1?write";?

//?或String?sql?=?"lock?tables?aa1?read";?

String?sql1?=?"select?*?from?aa1?";?

try?{?

this.pstmt?=?conn.prepareStatement(sql);?

mysql锁表怎么用-图1

this.pstmt1?=?conn.prepareStatement(sql1);?

pstmt.executeQuery();?

pstmt1.executeQuery();?

}?catch?(Exception?e)?{?

System.out.println("异常"?+?e.getMessage());?

}?

}

对于read lock 和 write lock官方说明:

①如果一个线程获得一个表的READ锁定,该线程(和所有其它线程)只能从该表中读取.

如果一个线程获得一个表的WRITE锁定,只有保持锁定的线程可以对表进行写入.

其它的线程被阻止,直到锁定被释放时为止.

虽然使用LOCKTABLES语句获得的锁定仍然有效,但是您不能访问没有被此语句锁定的任何的表.

同时,您不能在一次查询中多次使用一个已锁定的表——使用别名代替,

在此情况下,您必须分别获得对每个别名的锁定.

对与read lock 和 write lock个人说明:

①read lock 和 write lock 是线程级(表级别).

但是在不同会话中,只能对加了read lock的表进行读操作.但可以对read lock以外的表进行增、删、改、查的操作.

但是在不同会话中,无法对加了write lock的表进行读、写操作.但可以对write lock以外的表进行增、删、改、查的操作.

在对aa1加锁时,必须把别名加上去(lock tables aa1 as byname_table read)

在同一个会话中.必须使用别名进行查询.

在不同的会话中.可以不需要使用别名进行查询.

如果多个会话对同一个表进行lock read操作.那么在这些会话中,也只能对以锁的表进行读操作.

例如.lock table aa1 read ,aa1 as byname_table read;

另:

在JAVA程序中,要想解锁,需要调用 unlock tables来解锁.

如果没有调用unlock tables.

关闭connection 、程序结束 、调用GC 都能解锁.

String?sql?=?"select?*?from?aa1?for?update";?

//?select?*?from?aa1?lock?in?share?mode;?

conn.setAutoCommit(false);?

①for update 与 lock in share mode 属于行级锁和页级锁

在同一会话中加上了共享锁.可以对这个表以及这个表以外的所有表进行增、删、改、查的操作.

在不同的会话中.可以查到共享锁锁住行的最新消息.但是在Read Uncommitted隔离级别下不能对锁住的表进行删,

改操作.(需要等待锁释放才能操作...)

在Read Committed隔离级别下不能对锁住的表进行删,改操作.(需要等待锁释放才能操作...)

在Repeatable read隔离级别下不能对锁住行进行增、删、改操作.(需要等待锁释放才能操作...)

在Serializable隔离级别下不能对锁住行进行增、删、改操作.?(需要等待锁释放才能操作...)

在不同的会话中.可以查到共享锁锁住行的最新消息.但是Read Uncommitted隔离级别下不能对锁住的表进行删,

在Serializable隔离级别下不能对锁住行进行增、删、改操作. (需要等待锁释放才能操作...)

①.1.任何可以触发事务提交的命令,都可以关闭共享锁和排它锁.

MYSQL完美解决生产环境改表结构锁表问题

有时候,会很不小心,在业务运行中执行了一条锁表语句.这时候该怎么办?

例如:修改元数据.

SHOW FULL PROCESSLIST 查看一下:

然后一切又恢复正常了.

一般对于数据量较大的表,需要修改表结构,或者做一些耗时比较久的锁表操作,建议在晚上(业务闲时)执行.这个时候可以配合使用任务处理一下.

如:修改一个表的字段长度,和添加索引

名词解释:

接着回家睡觉,第二天回来检查结果就好了.

附:添加唯一索引示例

MYSQL存储过程结合任务处理耗时操作

MySQL锁表是什么意思?有什么用?什么情况下用?好处?缺点?

白话解说如下:

简单说,就是lock table,不让别人动

锁分共享锁和排它锁.

共享锁时,别人能读,不能改变量表数据

排它锁时,别人既不能读,也不能改表数据

根据以上特点,应该就知道何时使用锁了.不想让别人变更数据,对自己产生影响,就加锁.一定要在不用之后,进行锁释放,不然,应用系统会一直因为读取数据而报错.

好处就是,保证数据的原子性,完整性,一致性. 只有加锁者释放了锁,别人才能改变数据.

缺点就是,增加了系统开销,有可能产生锁等待,造成数据库运行异常.这都是不正常的使用锁带来的问题.

MySQL锁表和解锁操作

①.、确定mysql有锁表的情况则使用以下命令查看锁表进程

扩展:

①.、查看锁的事务

MySQL从入门到精通(九) MySQL锁,各种锁

全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将阻塞.其典型的使用场景就是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性.但是对数据库加全局锁是有弊端的,如在主库上备份,那么在备份期间都不能执行更新,业务会受影响,第二如果是在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志,会导致主从延迟.

解决办法是在innodb引擎中,备份时加上--single-transaction参数来完成不加锁的一致性数据备份.

添加全局锁: flush tables with read lock; 解锁 unlock tables.

表级锁,每次操作会锁住整张表.锁定粒度大,发送锁冲突的概率最高,并发读最低,应用在myisam、innodb、BOB等存储引擎中.表级锁分为: 表锁、元数据锁(meta data lock, MDL)和意向锁.

表锁又分为: 表共享读锁 read lock、表独占写锁write lock

语法: 1、加锁 lock tables 表名 ... read/write

元数据锁,在加锁过程中是系统自动控制的,无需显示使用,在访问一张表的时候会自动加上,MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作.为了避免DML和DDL冲突,保证读写的正确性.

查看元数据锁:

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema_metadata_locks;

意向锁,为了避免DML在执行时,加的行锁与表锁的冲突,在innodb中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查.意向锁分为,意向共享锁is由语句select ... lock in share mode添加.意向排他锁ix,由insert,update,delete,select...for update 添加.

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_lock;

行级锁,每次操作锁住对应的行数据,锁定粒度最小,发生锁冲突的概率最高,并发读最高,应用在innodb存储引擎中.

innodb的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁,对于行级锁,主要分为以下三类:

①.、行锁或者叫record lock记录锁,锁定单个行记录的锁,防止其他事物对次行进行update和delete操作,在RC,RR隔离级别下都支持.

innodb实现了以下两种类型的行锁

①.、共享锁 S: 允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁.

insert 语句 排他锁 自动添加的

update语句 排他锁 自动添加

delete 语句 排他锁 自动添加

select 正常查询语句 不加锁 ...

select ...lock in share mode 共享锁 需要手动在select 之后加lock in share mode

select ...for update 排他锁 需要手动在select之后添加for update

默认情况下,innodb在repeatable read事务隔离级别运行,innodb使用next-key锁进行搜索和索引扫描,以防止幻读.

间隙锁唯一目的是防止其它事务插入间隙,间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用的间隙锁.

mysql备份数据库 怎么锁表

文件的创建、删除、改名

账户的管理

REPAIR TABLE

TRUNCATE TABLE

OPTIMIZE TABLE

备份锁由?lock instance for backup?和?unlock instance?语法组成.使用这些语句需要 BACKUP_ADMIN 权限.

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章