SQL语言的目的是我们给数据库发送了指令, 让数据库帮我们做事情
1.事务可以理解为是让数据库做的事情
2.有些时候事情之内不止一条sql, 存在多个组成单元
比如:银行系统 转账 张三 100—>李四
update atm set abalance = 原来的钱-100 where aname = ‘张三’;
- 一件事情中的所有操作应该是统一的
- 要么都成功,要么都失败
4.事务的本质
可以理解为
多线程并发操作同一张表格可能带来的安全问题
事务的四大特性(ACID)
A:Atomicity———>原子性
一个事务中的所有操作是一个整体, 不可再分
事务中的所有操作要么都成功, 要么都失败
C:Consistency——>一致性
一个用户操作了数据, 提交以后
另一个用户他看到的数据与之前用户看到的效果是一致的
I:Lsolation——>隔离性——>事务隔离级别
指的是多个用户并发范文数据库时
一个用户操作数据库, 另一个用户不能有所干扰
多个用户之间的数据事务操作要互相隔离
D:Durability—->持久性
指的是一个用户操作数据的事务一旦被提交(缓存——->文件);
他对数据库底层真实的改变是永久性的 不可返回
—————————————————————————————————————————
mysql数据库事务管理默认的效果可以更改
commit(提交)
autocommit变量=on;
show variables like ‘%commit%;
show variables like ‘autocommit’;
set autocommit = off; //设置自动提交关闭;
1.开启一个事务
每一次执行的一条sql语句之前
mysql数据库都会默认的开启
begin start transaction;
2.执行操作
sql insert update delete
select
可能不止一条语句
3.事务的处理
提交/回滚/保存还原点
mysql数据库会默认的执行提交事务
——————————————————————————-
事务的隔离性可能会产生多线程并发操作同一个数据库表格的问题
会带来数据的安全隐患
脏读
一个人读到了另外一个人还没有提交的数据
A B 在操作同一张表格
A修改了数据, 还没有提交,B读到了
A不提交, 回滚回来, B刚刚 读到的那些数据就是无用的——脏数据
不可重复读
A B在操作同一个表格
A先读取了一些数据,读完之后B此时将数据做了修改/删除
A再按照之前的条件重
新读一遍, 与第一次读取的不一致
幻读(虚读)
A B在操作同一个表格
A先读取了一些数据, 读完之后B此时将数据做了新增
A再按照之前的条件重新读一遍,与第一次读取的不一致
需要考虑事务的隔离级别
Serializable 最高 可以避免所有出现的问题,性能很慢
Repeatable Read 可重复读(避免脏读,不可重复读)
Read Committed 读已提交(避免脏读)
Read UnCommitted 读取未提交(所有效果均无法保证)
MySQL数据库提供默认隔离级别 Repeatable Read;
Oracle数据库提供默认隔离级别 Read Committed;
事务隔离级别设置语句:
set session transaction isolation level read uncommitted;
