目录
简介
事务操作
查看/设置事务提交方式
开启事务
提交事务
回滚事务
四大特性ACID
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
并发事务问题
脏读
不可重复读
幻读
事务隔离级别
小结
多表查询的内容已经告一段落了,接下来要学习的是新的一个内容——事务,将分为几个点进行学习:
下面就先对事务进行一个简单大体的了解:
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
比如下面的三个操作(张三给李四转账1000块钱):
1.查询张三账户余额;
2.张三账户余额-1000;
3.李四账户余额+1000。
在一般情况下,
我们执行了操作1和2,若在2到3的过程中抛了异常,那么这时李四的余额就没有完成+1000的操作;但张三的账户余额仍减了1000,这就让张三白白丢了1000块钱了,显然不合理。
所以需要用事务来操作,将这些操作集并起来,
开启事务之后,执行操作1和2,当2到3的过程中抛了异常,这时就会回滚事务,重新回到操作1;
直到完成所有操作,才会提交事务。
默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
SELECT @@autocommit; -- 查看事务提交方式
SET @@autocommit = 0; -- 设置事务提交方式
-- 0代表手动提交事务,1代表自动提交事务
当我们将事务提交方式改为手动提交之后,每执行一次SQL语句都需要COMMIT;来提交事务,否则只是临时修改了数据,而并没有将数据提交到数据库中去。
START TRANSACTION 或 BEGIN;
开启事物之后,才会使得执行的语句变成手动提交;不同于上面的全局设置。
COMMIT;
当所有操作都无误之后,我们就可以提交事物,将数据提交到数据库中。
ROLLBACK;
当操作出现异常时,需要将操作撤销,重新开始操作,称为回滚事务。
这里的四大特性涉及到面试题
当一个事务在执行时,它会将一组SQL语句放在同一批次内去执行。如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。
例如,银行转账可以分解为两个动作:从A账户中扣除资金额X,然后将资金额X加到B账户中。如果在这个过程中发生了错误,那么整个操作都应该被回滚到初始状态。保证A和B加起来的账户余额要和初始状态一致。
例如,一个事务正在修改某个数据项,此时另一个事务也想要修改这个数据项,但是由于隔离性的存在,第二个事务会等待第一个事务完成修改后再进行修改 。
事务一旦提交,它对数据库的改变就应该是永久性的(将数据提交保存在了硬盘中),接下来的其他操作或故障不应该对本次事务的修改有任何影响 。
一个事务读到另外一个事务还没有提交的数据。
一个事务先后读到同一条记录,但两次读取的数据不同,称之为不可重复读。
一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了“幻影”。
要解决事务并发问题,就需要根据不同的并发问题来设置不同的隔离级别了
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted(Oracle默认) | 会出现 | 会出现 | 会出现 |
Read committed | 不会出现 | 会出现 | 会出现 |
Repeatable Read(MySQL默认) | 不会出现 | 不会出现 | 会出现 |
Serializable | 不会出现 | 不会出现 | 不会出现 |
查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别
SET [SESSION GLOBAL /* 设置当前窗口的事务隔离级别 */ ]
TRANSATION ISOLATION LEVEL [READ UNCOMMITTED | ......];
注:事务隔离级别越高,数据越安全,但是性能越低。
所以需要权衡事务并发问题与性能之间的天平,选择合适的隔离级别。
1.事务简介
事务是一组操作的集合,这组操作,要么全部执行成功,要么全部执行失败。
2.事务操作
START TRANSACTION; -- 开启事务
COMMIT / ROLLBACK; -- 提交/回滚事务
3.事务四大特性
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
4.并发事务问题
脏读、不可重复读、幻读
5.事务隔离级别
READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE
END
学习自:黑马程序员——MySQL数据课程