diff --git a/addons/point_of_sale/models/account_tax.py b/addons/point_of_sale/models/account_tax.py
index 8c130630d78bfbc05f874a23a0653e2d339e53d0..6e048832a52c5abffe27d5cf6eb5fb1ff249b8b4 100644
--- a/addons/point_of_sale/models/account_tax.py
+++ b/addons/point_of_sale/models/account_tax.py
@@ -2,27 +2,29 @@
 
 from odoo import _, api, models
 from odoo.exceptions import UserError
+from odoo.tools import split_every
 
 
 class AccountTax(models.Model):
     _inherit = 'account.tax'
 
     def write(self, vals):
-        forbidden_fields = set([
+        forbidden_fields = {
             'amount_type', 'amount', 'type_tax_use', 'tax_group_id', 'price_include',
             'include_base_amount'
-        ])
+        }
         if forbidden_fields & set(vals.keys()):
-            tax_ids = self.env['pos.order.line'].sudo().search([
+            lines = self.env['pos.order.line'].sudo().search([
                 ('order_id.session_id.state', '!=', 'closed')
-            ]).read(['tax_ids'])
-            # Flatten the list of taxes, see https://stackoverflow.com/questions/952914
-            tax_ids = set([i for sl in [t['tax_ids'] for t in tax_ids] for i in sl])
-            if tax_ids & set(self.ids):
-                raise UserError(_(
-                    'It is forbidden to modify a tax used in a POS order not posted. ' +
-                    'You must close the POS sessions before modifying the tax.'
-                ))
+            ])
+            self_ids = set(self.ids)
+            for lines_chunk in map(self.env['pos.order.line'].browse, split_every(100000, lines.ids)):
+                if any(tid in self_ids for ts in lines_chunk.read(['tax_ids']) for tid in ts['tax_ids']):
+                    raise UserError(_(
+                        'It is forbidden to modify a tax used in a POS order not posted. ' +
+                        'You must close the POS sessions before modifying the tax.'
+                    ))
+                lines_chunk.invalidate_cache(['tax_ids'], lines_chunk.ids)
         return super(AccountTax, self).write(vals)
 
     def get_real_tax_amount(self):