一、 首先了解一下什么是事务,特点及作用
- 概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
- 操作:
开启事务: start transaction;
回滚:rollback;
提交:commit;
以mysql为例:其中innodb和bdb支持事务而myisam等不支持事务。要是你测试时事务开启了没起作用别忘了检查你的引擎哦
示例:张三给李四转账500
首先张三账户金额大于500,正常来说张三账户减少500,李四账户增加500
情况一:正常
上图是正常现象,mysql是自动提交事务,每次执行DML的时候都自动提交,在另一个事务中结果也是一样的。
情况二:执行中间出现异常
你就会发现张三账户钱减了500但是李四账户中没有添加上500,导致总量少了500。这就会出现混乱。
解决方法,使用事务,
开启了事务之后,虽然出现异常数据改动了但是并没有提交,这时候并没有将数据写入硬盘中(数据库),在重新查询打开的页面中查询并没有改动数据。
可以选择回滚(没有进行选择提交在关闭的时候就会默认回滚数据)
如果没有异常直接进行提交就行,提交之后就会更改数据,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 1-- 创建一个表
2CREATE TABLE account (
3 id INT PRIMARY KEY AUTO_INCREMENT,
4 NAME VARCHAR(10),
5 balance DOUBLE
6 );
7 -- 添加数据
8 INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);
9
10-- 修改所有金额为1000
11update account set balance = 1000;
12
13-- 查询表中的金额
14select * from account;
15
16-- 开启事务
17start transaction;
18-- 张三給李四转账五百;
19 update account set balance = balance - 500 where name='zhangsan';
20
21-- 异常。。。
22 update account set balance = balance + 500 where name='lisi';
23
24-- 出现异常就会滚
25ROLLBACK;
26
27-- 没有异常九八结束数据,提交
28commit;
29
30
另一个查询
二、事务的默认提交和手动提交
1、MySQL中的事务是默认自动提交的。像Oracle数据库可就是需要手动来提交了
1
2
3
4
5
6
7 1-- 查询事务默认提交方式 结果中1代表自动提交 0代表手动提交
2 select @@autocommit;
3-- 修改默认提交方式
4set @@autocommit = 0;
5-- 可以自行去试
6
7
MySQL数据库中事务默认自动提交
1
2
3
4
5
6
7
8
9
10
11
12 1 * 事务提交的两种方式:
2 * 自动提交:
3 * mysql就是自动提交的
4 * 一条DML(增删改)语句会自动提交一次事务。
5 * 手动提交:
6 * Oracle 数据库默认是手动提交事务
7 * 需要先开启事务,再提交
8 * 修改事务的默认提交方式:
9 * 查看事务的默认提交方式:SELECT @@autocommit; -- 1 代表自动提交 0 代表手动提交
10 * 修改默认提交方式: set @@autocommit = 0;
11
12
三、事务的四大特征:
1、原子性:是不可分割的最小操作单位,要么同时成功要么同时失败
2、持久性:当事务提交或者回滚以后,数据库会持久化的保存数据。
3、隔离性:多个事之间。相互独立。
4、一致性:事务操作前后,数据总量不变
四、事务的隔离级别:(了解就好)
1、脏读: 一个事务读取得到另一个事务还没提交的数据
2、不可重复读(虚读):在同一个事务中,两次读取到的数据不一致。
3、幻读:一个事务操作(DML)数据表中所有的记录,另一个事务添加了一条数据,则第一个事务查询不到事物的修改
隔离级别:
- read uncommitted:读未提交
———– 产生的问题:脏读、不可重复读、幻读
2. read committed:读已提交 (Oracle)
———– 产生的问题:不可重复读、幻读
3. repeatable read:可重复读 (MySQL默认)
———– 产生的问题:幻读
4. serializable:串行化
———– 可以解决所有的问题(这种级别在开启了事务中,没有提交前,另一个事务操作同一数据时会处于等待状态,上个事务提交后才会直接执行)
但是随着级别越高越安全,但是效率也会越来越低
查询
数据库查询隔离级别:
1
2
3 1 select @@tx_isolation;
2
3
例如mysql:
数据库设置隔离级别:
更改了隔离级别之后需要重新打开连接窗口才会生效哦!!!
1
2
3 1set global transaction isolation level 级别字符串;
2
3