- 事务的基本介绍
- 概念:如果包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
- 例子:张三给李四转账500元
- 查询张三账户余额是否大于500
- 张三账户 余额-500
- 李四账户 金额+500
- 显然这些操作是需要同时成功或者同时失败的,假如只是执行了其中的几步操作,而没有全部执行,账户的数据就会不对等。
- 操作
- 开始事务:
START TRANSACTION
- 回滚:
ROLLBACK
当被事务管理的数据操作出现问题时,就会进行回滚,回到事务开始的时候的数据的状态。 - 提交事务:
COMMIT
如果事务执行完成之后,就会提交事务。
- 开始事务:
- 例子
– 张三给李四转账500
– 0.开启事务
START TRANSACTION;
– 1.张三 余额-500
UPDATE account SET balance = balance - 500 WHERE NAME=‘zhangsan’;
– 2.李四 余额+500
UPDATE account SET balance = balance + 500 WHERE NAME=‘lisi’;
– 3.未出现问题,提交事务
COMMIT;
– 4.出现问题,回滚到开启事务时的数据库的状态
ROLLBACK; - MySQL数据库中事务默认自动提交
- 事务提交的两种方式:
- 自动提交:
- MySQL数据库的sql语句提交方式
- 一条DML(增删改)语句会自动提交一次事务
- 手动提交
- Oracle 数据库默认是手动提交事务的
- 需要先开启事务,再提交
- 自动提交:
- 修改事务的提交方式:
- 查看事务的默认提交方式:
SELECT @@AUTOCOMMIT;
– 1代表自动提交 0代表手动提交 - 修改默认的提交方式
SET @@AUTOCOMMIT = 0;
'如果这么设置的话,所有的sql语句都需要commit语句来手动提交,不然无法生效。
- 查看事务的默认提交方式:
- 事务提交的两种方式:
- 事务的四大特征
- 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
- 持久性:如果事务一旦提交或者回滚后,数据库会持久化地保存数据
- 隔离性:多个事务之间相互独立。
- 一致性:事务操作前后数据总量不变。
- 事务的隔离级别(了解)
- 概念:多个事务之间是隔离的,相互独立的。但是多个事务操作同一批数据,则会引发一些问题,设置不同的隔离几黑可以解决这些问题。
- 存在问题:
- 脏读:一个事务,读取到另一个事务中没有提交的数据
- 不可重复度:在同一个事务中,两次读到的数据不一样。
- 幻读:一个事务的操作数据表中的所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
- 隔离级别:
- read uncommitted :读未提交
- 事务没有提交时,就能够被读取到,及读取的是临时的数据。
- 产生的问题:脏读、不可重复读、幻读
- read committed:读已提交(Oracle数据库默认的隔离级别)
- 读取已经提交的数据,指只有事务提交后才会读取到修改后的数据。
- 产生的问题:不可重复读、幻读
- repeatable read:可重复读(MySQL数据库默认的隔离级别)
- 查询的事务在提交前,没有办法读取到不同的数据,数据会保持不变,只有当前事务提交时,才会读取到不同的数据。
产生的问题:幻读 - serializable:串行化
- 相当于加了一个锁,一张表同时只能被一个事务操作,而别的事务没办法修改这张表
- 可以解决所有问题
- 注意: 隔离几倍从小到大安全性越来越高,但是效率越来越低
- 数据库查询隔离级别
SELECT @@TX_ISOLATION;
- 数据库设置隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;
- read uncommitted :读未提交
MySQL学习笔记07之事务
最新推荐文章于 2024-08-23 10:27:05 发布