MySQL中定义函数时报错:ERROR 1418 (HY000)

当在MySQL中定义函数时遇到ERROR 1418错误,原因是开启的bin-log需要函数声明具有DETERMINISTIC、NOSQL或READSSQLDATA属性。通过设置`set global log_bin_trust_function_creators=TRUE;`,然后重新定义函数,问题得以解决。此方法适用于需要在启用二进制日志的情况下创建函数的情况。

MySQL中定义函数时报错:
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)

在这里插入图片描述
原因:
这是我们开启了bin-log, 我们就必须指定我们的函数是否是
1 DETERMINISTIC 不确定的
2 NO SQL 没有SQl语句,当然也不会修改数据
3 READS SQL DATA 只是读取数据,当然也不会修改数据
4 MODIFIES SQL DATA 要修改数据
5 CONTAINS SQL 包含了SQL语句

其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。
如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。

输入语句:
set global log_bin_trust_function_creators=TRUE;

再次输入函数定义语句,成功:
在这里插入图片描述

### Python 多进程并发写入 MySQL 锁等待超 1205 的解决方案 在处理多个进程并发访问数据库的情况下,可能会遇到锁等待超错误 (Error Code: 1205),这是因为不同进程尝试在同一间修改相同的数据行或表结构。为了有效解决这个问题并提高系统的稳定性和性能,可以采取以下几种方法: #### 使用事务隔离级别控制读取一致性 通过设置合适的SQL语句来调整MySQL服务器上的默认事务隔离级别,可以在一定程度上减少死锁的发生概率。对于大多数应用场景而言,“可重复读”是一个较为折中的选择。 ```sql SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` 此命令会将当前连接下的新启动的事务设为指定的隔离等级[^1]。 #### 实现乐观锁定机制 引入版本号字段,在更新记录前先检查该条目的最新状态是否发生变化;如果发现数据已被其他操作更改,则放弃此次提交,并提示用户刷新页面重试业务逻辑流程。 ```python UPDATE table_name SET column=value, version=version+1 WHERE id=id AND version=@oldVersion; ``` 这里`@oldVersion`代表客户端获取到的目标对象原始版本值。只有当查询条件匹配成功才会执行实际的数据变更动作[^2]。 #### 应用程序层面加锁策略优化 利用Python标准库提供的同步原语如`multiprocessing.Lock()`实现互斥访问共享资源的功能,确保每次只有一个工作单元能够进入临界区完成特定任务。这虽然降低了整体吞吐量但是能彻底杜绝因争夺同一个文件描述符而引发的竞争状况。 ```python import mysql.connector from multiprocessing import Process, Lock def write_to_db(lock): try: connection = mysql.connector.connect( host='localhost', user='root', password='', database='test' ) cursor = connection.cursor() lock.acquire() insert_query = """ INSERT INTO test_table (data) VALUES (%s); """ value = ("some_data",) cursor.execute(insert_query,value) connection.commit() except Exception as e: print(f"An error occurred while writing to the DB {e}") finally: if 'connection' in locals(): connection.close() lock.release() if __name__ == '__main__': db_lock = Lock() processes = [] for _ in range(3): p = Process(target=write_to_db, args=(db_lock,)) p.start() processes.append(p) for proc in processes: proc.join() ``` 上述代码展示了如何创建一个简单的多进程环境并通过全局变量传递给各个子进程中使用的锁实例。每当有新的请求到来想要向目标表格插入一条新纪录之前都会调用一次`acquire()`函数从而阻塞后续同类型的活动直到前者结束为止.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dame'Seven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值