mysql学习笔记:事务
程序员文章站
2022-07-04 23:40:55
...
例:有一个account表,小白和小黑余额都是1000.
小黑要从小白处借500,代码实现如下:
UPDATE account SET balance = balance - 500 WHERE name = '小白';
UPDATE account SET balance = balance + 500 WHERE name = '小黑';
可是由于某些原因,第二行语句没有执行。显示结果如下:
小白的500元不见了。再小黑的钱也没有增加,这显然不合适。对于这种情况就要用到我们今天学的事务。
- 事务
描述:一个包含多个步骤的业务操作,要么全部成功,要么全部失败。- 开启事务 START TRANSACTION
例:START TRANSACTION; UPDATE account SET balance = balance - 500 WHERE name = '小白'; UPDATE account SET balance = balance + 500 WHERE name = '小黑';
- 回滚 ROLLBACK
当出现错误时,将数据还原成开始事务时的值。START TRANSACTION; UPDATE account SET balance = balance - 500 WHERE name = '小白'; UPDATE account SET balance = balance + 500 WHERE name = '小黑'; ROLLBACK;
- 提交 COMMIT
mysql中事件默认自动提交,可是开启事务后需要手动提交
如果没有提交只是进行临时修改,数据库中的值不会变化。只有提交后才会真正修改。START TRANSACTION; UPDATE account SET balance = balance - 500 WHERE name = '小白'; UPDATE account SET balance = balance + 500 WHERE name = '小黑'; COMMIT;
- 开启事务 START TRANSACTION
- 设置事务自动提交
- 查询提交状态
SHOW VARIABLES LIKE 'autocommit'; -- 方式一 SELECT @@autocommit; -- 方式二
- 设置提交状态
SET autocommit = ON; -- 方式一 'ON'表示:自动, 'OFF'表示:手动 SET @@autocommit = 1; -- 方式二 '1'表示:自动, '0'表示:手动
- 查询提交状态
- 事务的四大特性
- 原子性:不可分割,要么同时成功,要么同时失败
- 持久性:事务提交或回滚后,数据永久有效
- 隔离性:多个事务之间,相互独立
- 一致性 :事务操作前后,数据总量不变
- 事务隔离级别
-
注意:隔离级别越来越高,效率最来越低
- read uncommit 读未提交
产生:脏读、不可重复读、幻读 - read commit 读已提交(oracle默认)
产生:不可重复读、幻读 - repeatable read 可重复读 (mysql默认)
产生:幻读 - serializable 串行化
- read uncommit 读未提交
-
设置隔离级别
- 查询隔离级别
SELECT @@tx_isolation;
- 设置隔离级别
参数可以为:Read uncommitted、Read committed、Repeatable read、SerializableSET global TRANSACTION ISOLATION LEVEL Serializable;
- 查询隔离级别
-