MySQL数据库默认支持事务吗?

3

我想知道当多个用户同时尝试更新MySQL数据库时会发生什么。上网了解到事务

我需要为每个数据库UPDATE查询定义事务语句(START TRANSACTION,... COMMIT/ROLLBACK)吗?是否有自动化的方法来实现这一点?


3
默认情况下是自动提交,每个查询都是一个单独的事务。如果您想要跨多个查询的事务,必须显式地使用“START TRANSACTION”和“COMMIT / ROLLBACK”。 - Barmar
1个回答

3

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。


两个查询之间是否可以有其他代码?例如:START TRANSACTION; SELECT balance FROM bank WHERE userId=1; <基于上面获得的值的其他代码> UPDATE users SET balance=balance+100; COMMIT; - Nwaburu Emeka Christian
1
可以的。但请避免在事务中添加不必要的语句。您希望一个事务尽可能短,以减少资源竞争时间。根据事务隔离级别系统变量,使事务过于复杂可能会导致死锁。 - blabla_bingo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接