如何在mysql中使用事务保证操作一致性

老实说,MySQL 事务非常重要。
就是保证一堆操作要么全部成功,要么全部失败,不能半途而废,中间乱七八糟。

1 . 如何启动事务、提交或回滚
MySQL默认自动提交,autocommit=1 ,也就是说只要移动就会保存。
但如果你想使用事务,你就得手动关闭这个自动提交。

开始交易:只需点击“开始交易”即可; 或开始;。

然后,操作完成后,必须提交或者回滚。

提交:COMMIT;,保存所有更改。

回滚:ROLLBACK;,删除所有更改,就像没有更改过一样。

让我举个例子,银行转账。
开始交易,先扣第一个用户的钱,然后给第二个用户加钱。

sql 开始交易; 更新帐户 SET 余额 = 余额
1 00 WHERE user_id = 1 ; 更新帐户 SET 余额 = 余额 + 1 00 WHERE user_id = 2 ; -
您必须在这里检查第一个用户是否有足够的钱。
IF(从 user_id = 1 的账户中选择余额)>= 0 THEN 提交; 其他 回滚; ENDIF;
如果发现第一个用户钱不够,或者中间出了问题,就ROLLBACK,两个操作都会逆转,钱也不会动。

2 使用什么存储引擎
这取决于引擎。
InnoDB支持事务、行级锁和外键约束,是MySQL的默认引擎。
MyISAM不支持事务,所以即使使用BEGIN/COMMIT也没用。

建表时建议指定引擎为InnoDB。

sql 创建表帐户( id INT 主键, 用户 ID INT, 余额 DECIMAL(1 0, 2 ) ) 引擎 = InnoDB;
如果您想查看该表使用什么引擎,请输入 SHOW CREATE TABLE account; 它就会出现。

3 保存点,部分回滚
当事务比较复杂,想回滚一部分,保留一部分时,可以使用SAVEPOINT。

sql 开始交易; INSERT INTO 日志值 ('step1 '); 保存点步骤1 ; -
设置保存点 更新库存设置计数 = 计数
1 WHERE item_id = 1 00; -
假设这里出了问题,回滚到保存点 如果发生错误,那么 回滚到步骤1 ; -
仅撤消保存点之后的操作 ENDIF; 犯罪; -
提交剩余操作
ROLLBACK TO step1 之后,事务还没有完成,需要等待最终的COMMIT或者整体的ROLLBACK。

4 事务隔离级别
这个东西决定了并发事务之间可以看到什么。
有四个级别:
1 READ UNCOMMITTED:可以看到别人未提交的数据(脏读)。
2 . READ COMMITTED:只能看到别人提交的数据。
3 . REPEATABLE READ:同一个事务中多次读取的结果是相同的(默认)。
4 . SERIALIZABLE:完全序列化,就像依次顺序执行一样,一一执行,避免幻读。

设置方法:
sql 设置会话事务隔离级别已提交读;
场景建议:

对于高并发的库存扣减,可以使用REPEATABLE READ或者SERIALIZABLE来减少冲突。

如果一致性要求不高,直接READ COMMITTED就可以提高并发性能。

5 注意事项

逻辑包:转账的扣除和添加必须在一笔交易中进行。

异常处理:捕获代码中的异常并触发ROLLBACK。

性能权衡:SERIALIZABLE会降低并发性,必须根据业务需求而定。

长事务的风险:不要运行太长时间的事务,因为资源将被锁定并且连接池将已满。

总结:

打开交易:开始交易;
选择InnoDB作为引擎;
提交回滚:根据情况COMMIT或ROLLBACK;
保存点:复杂场景使用SAVEPOINT;
隔离级别:根据并发需求设置。

用好交易,调拨、库存扣减等关键业务就不会出现数据不一致的情况。

批量向MySQL导入1000万条数据的优化

1 .关闭自动提交,使用Start Transaction批量插入数据,不要每次输入都提交。
2 . 将存储驱动器更改为MyISAM,取消InnoDB重新注册。
更新速度快,但数据安全性较差。
3 、SQL优化,单条语句可以插入多条数据,效率很高。
4 、顺序插入,索引效率高,减少磁盘操作。

sql 关闭事务

上周 我的那个朋友 首先使用MySQL输入命令
设置autocommit=0。

然后决定是否提交 承诺。

或决定取消 回滚;
SQL服务器端 操作类似
正常使用 提交 或 ROLLBACK
如果你遇到困难 使用命令检查进程ID
杀死

但是这个很少用 您更有可能遇到问题
请先备份,然后再继续 更安全 请忘记