commit语句,rollback语句
事务的定义
一个事务是一个完整的逻辑单元,不可再分
比如,银行账户转账,从A账户向B账户转账10000,需要执行两条update语句:
update t_act set blance = blance -10000 where actno = ‘act-001’
update t_act set blance = blance +10000 where actno = ‘act-002’
以上两条DML语句必须同成功,或者同时失败,不允许出现一条成功,一条失败
要想保证以上的两条DML语句同时成功或者失败,那么就需要使用数据库的”事务机制“
事务相关语句
DML唯一与事务相关(insert delete update)
DML的三个语句都是和数据库表当中的“数据“相关的
事务的存在是为了保证数据的完整性,安全性
事务的使用
# 开启事务
set autocommit=0;
start transaction;
# 编写事务的语句
update account set balance = 1000 where username='张无忌';
update account set balance = 1000 where username='赵敏';
# 结束事务
commit;
事务的四大特性
-
A 原子性:事务是最小的工作单元,不可再分
-
C 一致性:事务必须保证多条DML语句同时成功或者同时失败
-
I 隔离性:事务A与事务B之间具有隔离
-
D 持久性:持久性说的是最终段数据必须持久化到硬盘文件中,事务才算成功的结束
并发问题
- 脏读:一般是更新数据,一个事务处理过程里读取了另一个未提交的事务中的数据
- 不可重复读:同一个事务前后两次读取获得的数据不一致
- 幻读:一般是插入数据或者删除,在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,导致一个事务的读取结果不能支撑后续操作实现
隔离级别
事务的隔离性存在隔离级别,理论上隔离级别有4个
-
第一级别:读未提交
对方事务还没提交,我们当前事务可以读取对方未提交的数据
读未提交存在脏读的现象,即读到了脏的数据
三个并发问题都不会被解决
-
第二级别:读已提交
对方事务提交之后的数据我方可以读到
解决脏读
事务B第一次查询一个表时,获得一个数据,事务A对表进行操作,修改表内容,并提交事务A,事务B再次查询表,获得与第一次查询不同的数据,产生幻读
-
第三级别:可重复读
确保事务可以从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新
解决脏读和不可重复读
事务A对一个表进行修改,修改运行了没提交,事务B对表进行查询,得到的时最初的,事务B没有提交,事务A提交,事务B再次对表进行查询得到的依然是最初的,事务B提交,之后再查询表,就是修改后的
-
第四级别:序列化读/串行化读
禁止其他事务对该表执行插入,更新和删除操作
效率低,解决所有问题
# 设置隔离级别
# 读未提交
set session transaction isolation level read uncommitted;
# 读已提交
set session transaction isolation level read committed;
# 可重复读
set session transaction isolation level repeatable read;
# 序列化/串行化
set session transaction isolation level serializable;
# 查看当前隔离级别
select @@transaction_isolation;
回滚
set autocommit =0;
start transaction;
delete from account where id =6;
savepoint a;# 设置保存点
delete from account where id =9;
rollback to a;
结果是删除了id=6的一行