我想知道当多个用户同时尝试更新MySQL数据库时会发生什么。上网了解到事务。
我需要为每个数据库UPDATE查询定义事务语句(START TRANSACTION,... COMMIT/ROLLBACK
)吗?是否有自动化的方法来实现这一点?
我想知道当多个用户同时尝试更新MySQL数据库时会发生什么。上网了解到事务。
我需要为每个数据库UPDATE查询定义事务语句(START TRANSACTION,... COMMIT/ROLLBACK
)吗?是否有自动化的方法来实现这一点?
MySQL默认启用自动提交,可以使用以下命令切换:
set session autocommit=off;
对于基于事务的查询,如银行业务,需要手动执行TRANSACTION命令,该命令忽略自动提交设置。例如:
START TRANSACTION;
update bank_card set balance=balance-100;
update credit_card set balance=balance+100;
ROLLBACK; -- execute rollback to cancel the transaction if necessary
COMMIT;
如果在任何UPDATE语句中出现问题,通过执行ROLLBACK;
来中止事务并且不会执行任何UPDATE操作。
当多个用户尝试更新同一张表时,MySQL会对相关行进行锁定以防止同时写入。第一个UPDATE查询在提交(成功)或回滚(通常出现问题)之前会释放锁定,然后第二个UPDATE查询才能获取锁定并执行UPDATE。