我需要在~5M行MySQL表上创建索引.这是一个生产表,如果我运行一个CREATE INDEX语句,我担心一切都完整.
有没有办法创建该索引而不阻止插入和选择?
只是想知道我没有停止,创建索引并重新启动我的系统!
根据MySQL手册:
对于大型表,表锁定通常比行锁定更好,
Why is this? I would presume that row-level locking is better because when you lock on a larger table, you're locking more data.
我使用laravel5.5的数据库事务进行在线支付应用程序.我有一个company_account表来记录每次付款(type,amount,create_at,gross_income).gross_income创建新记录时,我需要访问最后一条记录.所以我需要在具有读写表锁的事务时锁定表,以避免同时进行多次付款.
我已经参考了laravel的doc,但我不确定该事务是否会锁定表.如果事务将锁定表,那么什么是锁类型(读锁定,写锁定或两者)?
DB::transaction(function () {
// create company_account record
// create use_account record
}, 5);
Run Code Online (Sandbox Code Playgroud)
码:
DB::transaction(function ($model) use($model) {
$model = Model::find($order->product_id);
$user = $model->user;
// **update** use_account record
try {
$user_account = User_account::find($user->id);
} catch (Exception $e){
$user_account = new User_account;
$user_account->user_id = $user->id;
$user_account->earnings = 0;
$user_account->balance = 0;
}
$user_account->earnings += $order->fee * self::USER_COMMISION_RATIO;
$user_account->balance += $order->fee * self::USER_COMMISION_RATIO;
$user_account->save();
// **create** company_account record
$old_tiger_account = …Run Code Online (Sandbox Code Playgroud) 嘿.我使用delayed_job进行后台处理.我有8个CPU服务器,MySQL和我启动7个delayed_job进程
RAILS_ENV=production script/delayed_job -n 7 start
Run Code Online (Sandbox Code Playgroud)
Q1: 我想知道是否有可能2个或更多个delayed_job进程开始处理相同的进程(数据库delayed_jobs中的相同记录行).我检查了delayed_job插件的代码但是找不到它应该的方式的锁定指令(没有锁定表或SELECT ... FOR UPDATE).
我认为每个进程都应该在lock_by列上执行UPDATE之前锁定数据库表.他们只需更新locked_by字段即可锁定记录(UPDATE delayed_jobs SET locked_by ...).真的够了吗?不需要锁定?为什么?我知道UPDATE的优先级高于SELECT,但我认为这在这种情况下没有效果.
我对多线程情况的理解是:
Process1: Get waiting job X. [OK]
Process2: Get waiting jobs X. [OK]
Process1: Update locked_by field. [OK]
Process2: Update locked_by field. [OK]
Process1: Get waiting job X. [Already processed]
Process2: Get waiting jobs X. [Already processed]
Run Code Online (Sandbox Code Playgroud)
我认为在某些情况下,更多的工作可以获得相同的信息,并可以开始处理相同的过程.
Q2: 对于8CPU服务器,7个delayed_jobs是否是一个好的数字?为什么是/否.
这是10倍!
multithreading ruby-on-rails table-lock delayed-job table-locking
我有一个非常大的数据集(约300万条记录),需要在每日时间表上与更新和新记录合并.我有一个存储过程实际上将记录集拆分为1000个记录块,并使用MERGE带临时表的命令,以避免在数据更新时锁定活动表.问题是它并没有完全帮助.该表仍然"锁定",我们使用数据的网站在尝试访问数据时会收到超时.我甚至尝试将其分成100个记录块,甚至试图WAITFOR DELAY '000:00:5'查看是否有助于在合并块之间暂停.它仍然相当缓慢.
我正在寻找有关如何在不锁定表的情况下合并大型数据集的任何建议,最佳实践或示例.
谢谢
这是我最初的问题:
我试图弄清楚如何在SQL Server中强制执行EXCLUSIVE表锁.我需要解决不合作的读者(我无法控制,闭源的东西),明确地将他们的ISOLATION LEVEL设置为READ UNCOMMITTED.结果是,无论我在执行插入/更新时指定了多少锁和什么样的隔离,客户端只需要设置正确的隔离并返回读取我正在进行的垃圾.
答案结果很简单 -
虽然无法触发显式锁定,但任何DDL更改都会触发我正在寻找的锁定.
虽然这种情况并不理想(客户端阻塞而不是目击可重复读取),但它比让客户端覆盖隔离并读取脏数据要好得多.这是带有虚拟触发器锁定机制的完整示例代码
赢了!
#!/usr/bin/env perl
use Test::More;
use warnings;
use strict;
use DBI;
my ($dsn, $user, $pass) = @ENV{ map { "DBICTEST_MSSQL_ODBC_$_" } qw/DSN USER PASS/ };
my @coninf = ($dsn, $user, $pass, {
AutoCommit => 1,
LongReadLen => 1048576,
PrintError => 0,
RaiseError => 1,
});
if (! fork) {
my $reader = DBI->connect(@coninf);
$reader->do('SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED');
warn "READER $$: waiting for table creation";
sleep 1;
for … 我ALTER在一个有6000万行的大表上的MySQL 5.6数据库上运行以下命令:
ALTER TABLE `large_table` ADD COLUMN `note` longtext NULL,
ALGORITHM=INPLACE, LOCK=NONE;
Run Code Online (Sandbox Code Playgroud)
尽管同时指定ALGORITHM=INPLACE和LOCK=NONE,表被锁定,并且基本上是删除了应用,直到迁移完成.
我通过检查命令In_use输出中列的值来验证表确实已锁定SHOW OPEN TABLES.它被设定为1.
根据我在MySQL文档中收集的内容,此操作不应该锁定表.并且,如果没有锁定,MySQL无法继续执行命令.我将数据库升级到MySQL 5.7以查看它是否更好,但我在5.7上也遇到了同样的问题.
这是预期的行为吗?我怎么知道这里出了什么问题?
我需要做这样的事情
select * from myTable with (xlock,holdlock)
Run Code Online (Sandbox Code Playgroud)
使用实体框架.这可能吗?我已经开了一个TransactionScope与Serializable隔离级别,但我的选择没有锁定表.我希望他们锁定,直到我完成交易范围.
是否可以锁定一个表,使得持有者可以读写,而其他会话只能读取?
该文档似乎暗示读锁允许每个人只读,而写锁只允许持有者读写,而其他会话无法访问.似乎让持有者能够读写,而其他只能读取的会话将是一种非常常见的行为 - 也许是最常需要的行为.
也许在实施这种情况时遇到的性能太高了?
我需要一些帮助SELECT FOR UPDATE(相应的LOCK IN SHARE MODE).
我有一个大约有40万条记录的表,我需要在每一行上运行两个不同的处理函数.
表结构恰如其分:
data (
`id`,
`mtime`, -- When was data1 set last
`data1`,
`data2` DEFAULT NULL,
`priority1`,
`priority2`,
PRIMARY KEY `id`,
INDEX (`mtime`),
FOREIGN KEY ON `data2`
)
Run Code Online (Sandbox Code Playgroud)
功能有点不同:
priority1; 集data1和mtimepriority2; 集data1和mtime它们不应该同时修改同一行,但是select可能会在它们中返回一行(priority1并且priority2具有不同的值)并且如果是这样的话,事务可以等待(并且我希望这会是它阻止的唯一情况.
我正在根据以下查询选择数据:
-- For the first function - not processed first, then the oldest,
-- the same age …Run Code Online (Sandbox Code Playgroud) table-locking ×10
mysql ×5
transactions ×3
alter-table ×1
database ×1
delayed-job ×1
indexing ×1
innodb ×1
laravel ×1
large-data ×1
locking ×1
merge ×1
performance ×1
php ×1
production ×1
sql ×1
sql-server ×1
t-sql ×1
table-lock ×1