我试图理解事务是如何工作的,我遇到了一个对我来说没有多大意义的场景。我希望有人能帮我理解它。
我有两笔交易
事务1
BEGIN; update data set val = val + 1 where id = 1
事务2
BEGIN; select * from data
我打开了两个终端,开始第一个事务并运行更新查询。这假定为id为1的元组上的事务1提供了独占锁。
然后,在提交第一个事务之前,我在另一个终端中运行第二个查询。我预计它会停止,因为第一个事务具有排它锁,这将阻止该事务获取id为1的元组上的读锁。
但是,mysql运行select查询并返回“非脏”数据。
有人能给我解释一下my
根据,更新锁可以在需要写入的时候转换为独占锁。同时,三个锁(X、S和U)的兼容性可以参考下表。
X S U
X ✗ ✗ ✗
S ✗ ✓ ✓
U ✗ ✓ ✗
然而,在一些博客中提到,从MySQL 5.7开始就有一个SX锁,它实现了B-树上操作的文件并发(1977)中的一个思想。通过这些博客,我发现SX锁与update锁非常相似。例如,它们具有相同的兼容性表。
由于我找不到更多关于MySQL中SX锁的“正式”介绍,所以我想问这两种锁之间有什么区别?
SQL Server:如何持有select查询的排它锁?对于mysql,
select * from Employee e
where e.id=123
for update
其他并发事务无法读取或写入所选行。
如何在SQL server上实现同样的功能?
SELECT *
FROM Employee e
WITH (HOLDLOCK, ROWLOCK)
WHERE e.id = 123;
对于(HOLDLOCK,row LOCK ),它是否持有所选行的读锁定?有了读锁,其他事务仍然可以读取锁定的行,对吗?
我在MySQL中有一个触发器:
CREATE DEFINER = CURRENT_USER TRIGGER `test`.`view_AFTER_INSERT` AFTER INSERT ON `views` FOR EACH ROW
BEGIN
UPDATE metrics SET met_nu_vie = met_nu_vie + 1 WHERE usp_id = NEW.usp_id;
END
基本上,当用户从web应用程序中的另一个用户接收到“视图”时,系统在表“视图”中创建一个新行,在插入后,在另一个表(度量)中增加一个计数器值。
我的问题是:如果用户收到来自10个不同用户的1
以下查询
SELECT * FROM (SELECT * FROM Users) WHERE Id = 1
和
SELECT * FROM Users Where Id = 1
是等价的。但是根据文档,在Serializable模式下,所有的选择都是在LOCK in共享模式下进行的。这是否意味着在第一个示例中,整个Users表将在共享模式下被锁定?
在我的Rails代码中,我需要确认一个操作只有在某个记录超过1条时才被允许。出于这个原因,我需要锁定更新,然后执行读取。我的rails代码如下所示:
PaymentProfile.transaction do
profiles = PaymentProfile.lock("LOCK IN SHARE MODE").where(user_id: xxx)
if profiles.count > 1
#allow
else
#do not allow
end
end
从理论上讲,这可以很好地工作,并且确实可以正确地锁定行。但是,如果另一个请
我有一个相当大的表(数千万行),应用程序的启动脚本正在运行一些内容,包括行:
CREATE INDEX IF NOT EXISTS idx_trades_ticker_ts ON exchange.trades (ticker, ts);
索引已经存在,所以我希望这是一个不操作,但是连接超时所花费的时间太长了。
然后,数据库在日志中包含了以下内容:
STATEMENT: -- create index
CREATE INDEX IF NOT EXISTS idx_trades_ticker_ts ON exchange.trades(ticker, ts)
ER
根据参考SELECT ... LOCK IN SHARE MODE sets an IS lock and SELECT ... FOR UPDATE sets an IX lock.在MySQL 5.7。
我真的很困惑,因为IX和IX兼容。支持的意思是什么?
另一方面,我尝试了如下:
Sess1 db> BEGIN;
SELECT * FROM t WHERE id = 1 FOR UPDATE; -- id is a primary key
Sess2 db> BEGIN;
SELECT * FROM t WHERE id
我正在读High Performance MySQL这本书,它提到:
performing one query per table uses table locks more efficiently: the queries
will lock the tables invididually and relatively briefly, instead of locking
them all for a longer time.
即使当selecting某些东西时,MyISAM也会放置表锁?有人能解释一下吗?
我在hibernate中有一个代码片段,如下所示。
此方法是一种常见的方法,当我使用两种不同的锁(并行流)时,最终会出现死锁场景。我正在试图了解死锁的根本原因。
Spring/JPA/Hibernate/MySql
@Transactional(isolation = Isolation.SERIALIZABLE)
public void someMethod(String lockName) { // Lock name can be of two types
jpaRepository.lock(lockName, TIMEOUT_10_SECONDS);
List
我有多个线程使用同步作业启动器启动作业。当同时创建作业实例时,我会得到以下异常:
Exception in thread "pool-1-thread-1" org.springframework.dao.DataAccessResourceFailureException: Could not obtain last_insert_id(); nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to g
我正在使用Sphinx RT索引和MySQL DB,我现在遇到的问题是我需要数据保持一致,并且在它们上使用常规插入不是正确的方法,因为我可能会得到错误的索引数据或错误的数据库数据。
假设您在MySQL DB中有以下表
id, text
1, test is test
在RT索引中也有同样的结果
id, text
这里可能发生的典型竞争情况是两个用户同时更新内容。
因此,如果用户A使用以下文本进行更新
feeling good
用户B使用以下文本进行更新
nice whether
可能发生的许多事情之一是
Update RT index with user A text
Update DB
我正在尝试清理一个时态表。最快的方法是删除或截断表,然后回滚,只包含所需的行。现在我的问题是数据库的“死锁”。有没有办法使用'with nolock‘使数据库不锁定
BEGIN TRANSACTION;
drop table audit.Testing with (nolock) ;
rollback transaction
SELECT *
from
(select *
,rn = ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Id DESC)
FROM audit.testing with (nolock)
) a
有时,我会在我的应用程序中收到以下死锁错误:
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction
有问题的表格如下所示:
CREATE TABLE `oauth_access_token` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`access_token` text COLLATE utf8_unicode_ci NOT NULL,
`oauth_cli