什么是事物?要么都成功,要么都失败
比如 A卡里有 1000 块,B 卡有500 块 A 转账 100 到 B 卡 如果在转账的时候,只执行到一半,A 转账了,B 没收到,这样肯定是不行的
所以需要事务来保证安全性
事务原则:ACID 原则
原子性一致性隔离性持久性隔离级别
读取未提交 : 有脏读的问题读取已提交:有不可重复读的问题可重复读:有幻读的问题可串行化:解决以上所有问题执行事务
事务处理过程
关闭自动提交开启一个事物如果成功则提交如果失败则回滚事务结束后,开启自动提交
-- ========事务======== -- mysql 是默认开启事务自动提交的 SET autocommit = 0 /*关闭*/ SET autocommit = 1 /*开启*/ -- 手动去处理事务 -- 事务开启 START TRANSACTION -- 标记一个事物,从这个之后的 SQL 都在同一个事务内 -- insert xx -- 提交:持久化(成功!) COMMIT -- 回滚: 回到原来的样子 (失败!) ROLLBACK -- 事务结束 SET autocommit = 1 /*开启自动提交*/模拟场景:银行转账
-- ======== 模拟银行转账案例=========== CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci USE shop CREATE TABLE `account`( `id` INT(3) NOT NULL AUTO_INCREMENT, `name` VARCHAR(30) NOT NULL, `money` DECIMAL(9,2) NOT NULL, PRIMARY KEY (`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8 INSERT INTO `account`(`name`,`money`) VALUES ('A',2000.00),('B',10000.00) SET autocommit =0 -- 关闭自动提交 START TRANSACTION -- 开启一个事物 UPDATE `account` SET money = money-500 WHERE `name`='A' UPDATE `ACCOUNT` SET money = money+500 WHERE `name`='B' COMMIT; -- 提交事物 ROLLBACK; -- 回滚 SET autocommit = 1;在实际的开发过程中,一个业务操作如:转账,往往是要多次访问数据库才能完成的。转账是一个用户扣钱,另一个用户加钱。如果其中有一条 SQL 语句出现异常,这条 SQL 就可能执行失败。事务执行是一个整体,所有的 SQL 语句都必须执行成功。如果其中有 1 条 SQL 语句出现异常,则所有的 SQL 语句都要回滚,整个业务执行失败