wazum / transactional-data-handler
将TYPO3 CMS DataHandler处理封装在数据库事务中
Requires
- php: ^8.2
- typo3/cms-core: ^11 || ^12
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.13
- slevomat/coding-standard: ^8.8
- squizlabs/php_codesniffer: ^3.7
- vimeo/psalm: ^5.6
README
此扩展将所有DataHandler过程调用(process_datamap
,process_cmdmap
)封装在一个数据库事务中,以便在处理过程中发生错误(下面将说明是什么意思)时,所有更改都将回滚。
当然,如果发生超时(例如PHP),这也适用,因为在这种情况下,数据库不会将更改提交到表。
风险自负!
安装
使用已安装的Composer要求该包
composer require "wazum/transactional-data-handler"
如果您在TYPO3 CMS日志文件中收到错误消息,表明无法实例化合适的连接,请将以下设置添加到您的全局设置中(AdditionalConfiguration.php
)
$GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['wrapperClass'] = \Wazum\TransactionalDataHandler\Database\Connection::class;
错误和异常
如果设置了相应的设置(见下文),则处理过程中发生的任何DataHandler
错误日志条目都会导致数据库回滚。
否则,只有真正的PHP异常才会导致数据库回滚。
扩展设置
在DataHandler错误日志条目上抛出异常
# cat=basic/enable; type=boolean; label=Throw exception when DataHandler's error log is not empty after processing
throw_exception_on_error_log_entries = 0
如果您想始终在DataHandler的错误日志包含任何内容时回滚事务,请更改此设置。
默认值为0
(仅在实际上抛出(而不是先前捕获)的PHP异常的情况下重置事务)。
可能的问题
错误日志
在出现问题时,请查看TYPO3 CMS错误日志。
数据库锁定
如果您遇到任何数据库锁定错误,请查看下文的事务设置部分。同时检查您的表是否有缺失的索引,这会减慢任何数据库事务的速度。
扩展DataHandler
此扩展扩展了核心DataHandler
类(XCLASS)。如果您使用任何其他执行相同操作的扩展,您必须自己解决此问题。
$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][DataHandler::class] = [
'className' => TransactionalDataHandler::class
];
MySQL存储引擎和事务设置
InnoDB支持事务,这意味着您可以提交和回滚。MyISAM不支持(即使您没有收到错误)!
如果您期望在遇到InnoDB锁定等待错误时自动回滚事务,请将以下设置设置为MySQL/MariaDB配置中:
innodb_rollback_on_timeout=1
在服务器重启后验证
mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_rollback_on_timeout';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| innodb_rollback_on_timeout | ON |
+----------------------------+-------+
您还可以降低innodb_lock_wait_timeout
的值,您可以在此处了解更多信息:这里
另一个要考虑的配置更改是将事务隔离级别设置为READ COMMITTED
,您可以在此处了解更多信息:这里
[mysqld]
transaction-isolation = READ-COMMITTED
有关InnoDB错误处理的更多信息,请参阅这里。
有关InnoDB错误处理的更多信息,请参阅这里。
隐式提交
某些SQL语句会导致当前打开的事务隐式提交
(例如TRUNCATE
)。此扩展已经处理了TRUNCATE
情况(语句将在事务成功提交后执行)。
检查您的代码和使用的扩展的代码,确保即使在发生失败异常的情况下,事务也已提交而不是回滚。
不影响数据库的更改
如果任何DataHandler钩子或相关部分在文件系统中更改任何内容(例如移动文件)或通过API,这些更改显然不会被回滚。
说谢谢!并支持我
你喜欢这个扩展吗?从我的愿望清单上为我(惊喜!惊喜!)买点东西吧,愿望清单请访问亚马逊或帮助我支付下一顿披萨或越南河粉(mjam)。非常感谢!