MySQL事务和锁定
事务
事务是指一组SQL语句的执行,这些语句要么全部执行成功,要么全部执行失败。如果其中任意一个语句执行失败,整个事务都会被回滚,即所有修改都会被撤销,使数据保持一致性。
MySQL使用以下语句控制事务:
- START TRANSACTION:开始一个事务。
- COMMIT:提交一个事务,如果事务执行成功,会保存所有的修改。
- ROLLBACK:回滚一个事务,如果事务执行失败,会撤销所有的修改。
在MySQL中,默认是自动提交模式,也就是每个SQL语句执行完毕后都会自动提交,因此需要手动开启事务才能进行事务操作。开启事务后,所有语句都将在事务范围内执行,只有在执行COMMIT语句时,修改才会被保存。如果在事务执行过程中出现错误,可以使用ROLLBACK语句回滚事务。
例如,以下语句可以开启一个事务,向employee表中插入一条记录,并更新salary列的值,最后提交事务:
START TRANSACTION;
INSERT INTO employee (firstName, lastName, salary) VALUES ('John', 'Doe', 5000);
UPDATE employee SET salary = 6000 WHERE id = 1001;
COMMIT;
锁定
锁定是指在对数据库进行修改时,为了保证数据的一致性和完整性,会对数据表或行进行加锁,禁止其它事务对数据进行修改。
MySQL中支持两种锁定方式:
- 表级锁定(Table Locking):锁定整个数据表,禁止其它事务对数据表进行修改。
- 行级锁定(Row Locking):锁定数据表中的某一行,禁止其它事务对该行进行修改。
MySQL中支持以下锁定类型:
- 共享锁(Shared Lock):允许多个事务同时读取同一行数据,但禁止其它事务对该行进行修改。也称为读锁。
- 排他锁(Exclusive Lock):禁止其它事务同时读取或修改同一行数据。也称为写锁。
在MySQL中,可以使用以下语句进行锁定:
- SELECT ... FOR UPDATE:使用排他锁(写锁)锁定查询结果。
- SELECT ... LOCK IN SHARE MODE:使用共享锁(读锁)锁定查询结果。
例如,以下语句可以使用排他锁(写锁)锁定employee表中id为1001的员工记录:
SELECT * FROM employee WHERE id