在书的6.3.3.3节中,它写道,在MySQL可重复读取隔离级别中,丢失更新现象是可能的。这是截图:
假设以下条件(隔离级别是可重复读取的):
tx1 | tx2
-----------------------------------------------------------------------------------
START TRANSACTION; |
SELECT * FROM test WHERE id = 1; |
要求是将一些数据从活动数据库(目前是159个表)提取到另一个数据库中,以便复制的数据具有完全的引用完整性,而数据是不断变化的(它是一个实时数据库)。这不是要转储整个数据库(接近50 is ),只是将我们从整个数据库中确定的一些行提取到一个单独的数据库中。
目前,我们根据初始模式和后续的DDL迁移和可重复项(视图、存储过程等)创建一个新的DB,然后复制相应的行。这通常需要10分钟以上,但不到1小时,这取决于要提取的集合的大小。
有没有办法告诉mysql,在我开始运行提取之后,我希望忽略所有提交的事务,无论是添加的新行、删除的行还是更新的行,但到数据库的任何其他连接都会继续正常工作,就像我没有发出
我有两个Python线程访问同一个MySQL数据库,每个线程都有自己的连接和游标对象。一个线程将一条记录插入到表中。正如我所期望的那样,在MySQL工作台中,在写入线程执行commit之前,我不会看到表的长度增长,然后我看到了变化。问题是,我的另一个线程看不到变化:它看到的是表的旧状态,就好像提交从未发生过一样。当我重新启动应用程序时,表的长度确实得到了正确的读取,但无论写入线程追加和提交了多少条记录,表的长度都会一直保持不变。我觉得我遗漏了一些很明显的东西。
为了读取表的长度,我尝试过: select count(*) from mystupidtable count( id ) from
MySQL文档()
如果发生重复键错误,则在重复索引记录上设置共享锁.如果有多个会话试图插入同一行(如果另一个会话已经具有独占锁),则共享锁的这种使用会导致死锁。..。
..。
插入..。在重复键更新中,与简单插入不同的是,当发生重复键错误时,将独占锁而不是共享锁放置在要更新的行上。
我已经阅读了相应的源代码(),在出现重复键错误时,InnoDB确实设置了S或X锁。
if (flags & BTR_NO_LOCKING_FLAG) {
/* Set no locks when applying log
in online table rebuild. */
}
这是我的案子:
CREATE TABLE test (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, value INT DEFAULT 0);
INSERT INTO test (id, value) VALUES (1, 10);
会话A
START TRANSACTION;
SELECT value FROM test WHERE id = 1;
10
会话B
START TRANSACTION;
SELECT value FROM test WHERE id = 1;
10
会话A
UPDATE test SET value = valu
我注意到我的申请中有奇怪的行为。在提交之后,似乎无法看到已完成的数据。算法如下所示:
connection1 - insert into table row with id = 5
connection1 - commit, close
connection2 - open
connection2 - select from table row with id = 5 (no results)
connection2 - insert into table row with id = 5 (PRIMARY KEY VIOLATION, result is in db)
如果select在con
我有一个大表,必须在其中更新几行。我试图使用多个线程同时更新不同的行,但是MySql似乎锁定了表中的所有行,而不是只锁定那些由“where”子句匹配的行。因此,更新不是并发的,有时会导致锁定超时错误。
有没有任何方法可以同时更新不同的行?
我在后端使用Django执行更新操作。我可以转到Postgres,但会有帮助吗?还是仍然存在锁定问题?
更新:添加代码段:
def process_calculate_training(base_dept, exch_dept):
# First initialize training to None, this is not happening c
所以,我读过很多关于sqlalchemy是如何工作的相互矛盾的报道。我读过,它没有缓存查询,等等,似乎没有一个与我的经验相匹配。
我举一个例子:
>>> x = Session.query(statusStorage).all()
>>> for i in x:
... print i.id
...
1
... - records omitted
100000
>>> Session.expire_all()
>>> x = Session.query(statusStorage).all()
>&
MySQL 5.6关于可重复读取隔离级别的文档
这意味着,如果在同一事务中发出几个普通(非锁定) SELECT语句,这些SELECT语句也是一致的。
反向(有些)担保也成立吗?也就是说,尚未阅读的任何记录,是否将是其自身的最新版本?我真正想要理解的是,在MySQL中,在启动事务和查询锁(SELECT ... FOR UPDATE)之间是否存在获取数据中的竞争条件的可能性?
示例:
Transaction 1 Transaction 2
begin
begi
在我的服务类(它被注释为事务处理)中,我更新对象并将其保存为:
myObj.save(flush:true) //(Thread A, updates the value, Step A)
在此之后,对数据进行处理需要很长时间。在此过程中,域类中进行了大量更改,但这些更改在这里并不相关。因为所有这些处理都发生在同一个服务类中,所以它是单个事务的一部分。
同时,当所有这些处理进行时,另一个线程(它是另一个hibernate会话的一部分)访问
MyObj.findAll() //Thread B,在结果集中,我看到了更新的值。在Step A中更新的值,但是线程A尚未完成,因此更改尚未提交给数据