未提交的读取/Sequelize 上没有锁定不起作用

问题描述 投票:0回答:1

我原来的代码:

const DEFAULT_PAGE_SIZE = 1001;
const MAX_PAGE_SIZE = 1001;
const DEFAULT_PAGE_SIZE2 = 91;
const MAX_PAGE_SIZE2 = 91;
function calculateOffset(page, pageSize) {
    return (page - 1) * pageSize;
}

router.get('/production-data/pagination', async (req, res) => {
    try {
        const page = parseInt(req.query.page) || 1;
        let pageSize = parseInt(req.query.pageSize) || DEFAULT_PAGE_SIZE;
        pageSize = Math.min(pageSize, MAX_PAGE_SIZE);

        const offset = calculateOffset(page, pageSize);
        const productionData = await ProductionData.findAndCountAll({
            order: [['SaveTime', 'DESC']],
            limit: pageSize,
            offset: offset,
        });

        const nextPage = page + 1;

        res.json({
            data: productionData.rows,
            totalItems: productionData.count,
            currentPage: page,
            pageSize: pageSize,
            nextPage: nextPage,
        });
    } catch (error) {
        console.error('Error fetching order data:', error);
        res.status(500).json({ error: 'Internal server error' });
    }
});

我原来的代码日志:

Executing (default): SELECT 1+1 AS result
Connection has been established successfully.
Executing (default): SELECT count(*) AS [count] FROM [dbo].[tGapHistory] AS [ProductionData];
Executing (default): SELECT [SaveTime], [LineCode], [GAP], [PEND], [MKCNT] FROM [dbo].[tGapHistory] AS [ProductionData] ORDER BY [ProductionData].[SaveTime] DESC OFFSET 91 ROWS FETCH NEXT 91 ROWS ONLY;

读取未提交的尝试(对于 nolock):

const productionData = await sequelize.transaction(async (t) => {
    return await ProductionData.findAndCountAll({
        order: [['SaveTime', 'DESC']],
        limit: pageSize,
        offset: offset,
        transaction: t,
        isolationLevel: Sequelize.Transaction.ISOLATION_LEVELS.READ_UNCOMMITTED
    });
});

读取未提交的尝试日志:

Connection has been established successfully.
Executing (7e4567741ff6d10cf0fb): BEGIN TRANSACTION;
Executing (7e4567741ff6d10cf0fb): SELECT count(*) AS [count] FROM [dbo].[tGapHistory] AS [ProductionData];
Executing (7e4567741ff6d10cf0fb): SELECT [SaveTime], [LineCode], [GAP], [PEND], [MKCNT] FROM [dbo].[tGapHistory] AS [ProductionData] ORDER BY [ProductionData].[SaveTime] DESC OFFSET 
91 ROWS FETCH NEXT 91 ROWS ONLY;
Executing (7e4567741ff6d10cf0fb): COMMIT TRANSACTION;

您好,我正在制作自己的项目来查询测试数据库中的数据。有人建议我在读取数据时实现“无锁”。

我已经尝试过,但无法弄清楚为什么 READ_UNCOMMITTED 不起作用。根据日志,它显然正在尝试提交事务,这比我原来的情况更糟糕。

如有任何帮助,我们将不胜感激!!

sql node.js sequelize.js
1个回答
0
投票

您看到的行为与事务隔离级别无关。您的事务会提交,因为这是

sequelize.transaction
的默认行为。托管事务运行回调中的所有语句;如果发生任何错误,它会自动回滚。因此,如果您不希望提交该事务,请在托管事务回调中抛出错误

事务隔离级别指定数据库服务器在执行事务中的语句时可以采取哪些自由。一般来说,事务的想法是隔离所有更改直到它被提交。但是,如果不需要某些保证,您可以允许服务器忽略它们以获得更多性能。

“读取未提交”级别允许服务器读取(例如使用“SELECT”)其他事务尚未提交的更改。这称为

脏读
举个例子,如果语句按顺序发出:

交易A:
    INSERT INTO posts (text) VALUES ('Post X')
  1. 交易B:
  2. SELECT * FROM posts
  3. 交易A:
  4. ROLLBACK TRANSACTION
  5. 
    
  6. 通常,您不希望事务 B (2) 收到“Post X”结果,但通过
read uncommissed

,您可以。 还需要注意的是,服务器不必为您提供未提交的结果,只是它可以。例如,PostgreSQL 使用

MVCC

并且不会从允许脏读中获得性能优势,因此 读未提交读已提交 事务隔离级别的行为相同

© www.soinside.com 2019 - 2024. All rights reserved.