mysql - 数据库并发

标签 mysql database concurrency transactions isolation-level

在我公司,我们有一个小测验。我无法通过我将在下面描述的测验。我们有 3 笔交易。在这些事务 select sum(b) from a 返回 1000 之前。表中的值不是 10、20 或 30。隔离级别是 read committed。所有 3 个事务并行执行。

交易 №1

select sum(b) from a;
commit;

交易 №2

insert into a values (30);
insert into a values (20);
insert into a values (10);
commit;

交易 №3

delete from a where b = 10;
delete from a where b = 20;
delete from a where b = 30;
commit;

第一笔交易会返回什么?首先我注意到没有 start transaction 语句。你能解释一下结果吗?我已经回答了 1010,但我错了。

第二个小测验我也过不了。我将在下面描述它。相同的条件,但隔离级别是 read uncommitted

交易 №1

start transaction;
select sum(b) from a;
commit;

交易 №2

start transaction;
insert into a values (30);
insert into a values (20);
insert into a values (10);
commit;

交易 №3

start transaction;
delete from a where b = 10;
delete from a where b = 20;
delete from a where b = 30;
commit;

我猜数据库是mysql(innodb),但在小测验中没有指定。

最佳答案

我假设每个事务仅并行启动一次。

在第一个测验中,连接将在自动提交模式下工作。因此,结果可以是 1000、1030、1050、1060、1010。由于插入和删除的顺序,1020 和 1040 是不可能的。

在第二个测验中,数据库将隔离完整的事务,因此结果可能是 1000 或 1060。

关于mysql - 数据库并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47287724/

相关文章:

PHP 正在插入两条记录

exception - 并发程序中具有不可变 Map 的 Scala 错误?

java - 我们什么时候在处理 'GET' 的 java 方法上使用 Synchronized ?

java - Hibernate:如果子项以多对一方式链接到父项,如何让 Hibernate 在删除父项时从子表中删除记录?

mysql - 如何将 Apache Derby 数据库转换为 MySQL

mysql - Ruby on Rails 中的读取锁定

php - 获取 'array' 或 'Resource id #5'

mysql - 在 MySQL 中设计数据库时的最佳实践

mysql - ER 图不显示 Datagrip 中的关系

java - Actor 模型实现中的多个 Apache HTTP 客户端