MYSQL事务中用行锁

表锁一般没什么用,因为在事务中解除表锁的话会直接提交事务。
在事务中一般用到的是行锁,即innodb引擎支持。

共享锁例子:
#session1 会话1
start transaction;
SELECT * FROM feedback LIMIT 1,10;#无视
SELECT * FROM feedback LIMIT 1 FOR UPDATE;#只有加行锁的这行是锁定状态(FOR UPDATE)
COMMIT; #提交事务

#session2 会话2
start transaction;
  update feedback set title='会话1行锁' where id=3;#该行无锁,直接执行
  update feedback set title='会话1行锁' where id=1;#有锁,需要等待
COMMIT; #提交事务



排它锁例子:
#session1 会话1
start transaction;
  UPDATE feedback set title='会话1排它锁' where id=1 FOR SELECT;#排它锁
COMMIT; #提交事务

#session2 会话2
start transaction;
  update feedback set title='会话1行锁' where id=3;#该行无锁,直接执行
  update feedback set title='会话1行锁' where id=1;#有锁,需要等待
COMMIT; #提交事务


因为之前用过oracle,知道利用select * for update 可以锁表。所以很自然就想到在mysql中能不能适应for update来锁表呢。

学习参考如下

 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住)。 
举个例子: 
假设有个表单products ,里面有id跟name二个栏位,id是主键。 
例1: (明确指定主键,并且有此笔资料,row lock) 
SELECT * FROM products WHERE id='3' FOR UPDATE; 
例2: (明确指定主键,若查无此笔资料,无lock) 
SELECT * FROM products WHERE id='-1' FOR UPDATE; 
例2: (无主键,table lock) 
SELECT * FROM products WHERE name='Mouse' FOR UPDATE; 
例3: (主键不明确,table lock) 
SELECT * FROM products WHERE id<>&apos;3&apos; FOR UPDATE; 
例4: (主键不明确,table lock) 
SELECT * FROM products WHERE id LIKE &apos;3&apos; FOR UPDATE; 
注1: FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。 
注2: 要测试锁定的状况,可以利用MySQL的Command Mode ,开二个视窗来做测试。

由上面的InnoDB 已经交易区块引出两个问题。

1. what is InnoDB?

 MySQL是我们比较常用的一种数据库软件。它有着诸多的优点,如开源的,免费的等等。其实它还有一个很好的特点,那就是有多种引擎可以供你选择。如果赛车手能根据不同的路况,地形随手更换与之最适宜的引擎,那么他们将创造奇迹。然而目前他们还做不到那样便捷的更换引擎,但是我们却可以! 
     所谓知己知彼方可百战不殆,要想将它们发挥到极致,首先我们应该来认识一下MySQL提供给我们的这几种引擎。
     一般来说,MySQL有以下几种引擎:ISAM、MyISAM、HEAP、InnoDB和Berkley(BDB)。注意:不同的版本支持的引擎是有差异的。

进一步:

如何查看MySQL的当前存储引擎?
一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看:

看你的mysql现在已提供什么存储引擎:
mysql> show engines;

以上说明我的mysql默认使用的InnoDB引擎,并且支持MyISAM,memory,archive,Mrg_myisam。

 后面还跟着解释, InnoDB 的解释是:支持事务,行级别锁定,外键。

看你的mysql当前默认的存储引擎:
mysql> show variables like &apos;%storage_engine%&apos;;

 

你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):
mysql> show create table 表名;
MySQL中,(Row-Level Locking)是一种定机制,它用于确保在并发环境中对数据库表的单一操作时的原子性和一致性。分为以下几种: 1. **共享(Shared Locks, S)**:当两个事务同时获取一个数据的共享时,它们可以读取该,但不允许其他事务对其进修改。直到其中一个事务结束释放。 2. **排他(Exclusive Locks, X)**:独占允许一个事务读取并修改一,其他事务则无法对该任何操作,包括读取。这保证了数据的一致性。 3. **临界区(Next-Key Locks)**:主要用于InnoDB存储引擎的定,X不仅定当前,还定其后续的间隙(gap)。如果事务需要插入,它会获得下一个空隙的。 4. **乐观**:MySQL默认采用乐观策略,在读取时不会自动加,而是依赖于版本号(version number)或时间戳来检查并发更新。如果发现冲突,则回滚事务。 要直接查询的状态,MySQL没有提供内置的系统视图,但你可以通过分析InnoDB的内部表(如`innodb_trx`、`innodb_locks`等)来间接查看。例如,使用以下命令查看某个事务是否持有特定: ```sql SELECT * FROM information_schema.INNODB_LOCKS WHERE TRX_ID = <transaction_id> AND TABLE_NAME = '<table_name>' AND INDEX_NAME = '<index_name>'; ``` 其中,`<transaction_id>`是事务ID,`<table_name>`是表名,`<index_name>`是索引名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值