事务
事务
-
什么是事务?
要么都成功,要么都失败
-
事务原则: ACID原则性 一致性,隔离性,持久性 (脏读,幻读)
原子性(Atomicity)
要么都成功,要么都失败
一致性(Consistency)
事务前后数据的完整性必须保持一致。持久性(Durability) —- 事务提交
事务一旦提交则不可逆,被持久化到数据库中!
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
-
隔离所导致的一些问题
脏读:
指一个事务读取了另外一个事务未提交的数据。
不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
虚读(幻读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。(一般是行影响,多了一行)
-
执行事务
-- ========== 事务 ========== -- MySQL 是默认开启事务自动提交的 SET autocommit = 0 /*关闭*/ SET autocommit = 1 /*开启(默认的)*/ -- 手动处理事务 SET autocommit = 0 -- 关闭自动提交 -- 事务开启 START TRANSACTION -- 标记一个事务的开始,从这个之后的sql都在同一个事务内 INSERT xx INSERT xx -- 提交: 持久化 COMMIT -- 回滚: 回到原来的样子(失败!) ROLLBACK -- 事务结束 SET autocommit = 1 -- 开启自动提交 -- 了解 SAVEPOINT 保存点名 -- 设置一个事务的保存点 ROLLBACK TO SAVEPOINT 保存点 -- 回滚到保存点 RELEASE SAVEPOINT 保存点 -- 撤销保存点
模拟场景
-
-- 转账 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`) VALUE ('A',2000.00),('B',10000.00); -- 模拟转账: 事务 SET autocommit = 0; -- 关闭自动提交 START TRANSACTION -- 开启一个事务 UPDATE account SET money=money-500 WHERE `name` = 'A' -- A减500 UPDATE account SET money=money+500 WHERE `name` = 'B' -- B加500 COMMIT; -- 提交事务,就被持久化了! ROLLBACK; -- 回滚 SET autocommit = 1; -- 恢复默认值
java方法(){
try(){
正常的业务代码
commit();
}catch(){
rollback();
}
}

浙公网安备 33010602011771号