本文共 2373 字,大约阅读时间需要 7 分钟。
一个事务是一个完整的业务逻辑单元,不可再分。例如:银行账户转账,从A账户向B账户转账10000元,需要执行两条UPDATE语句:
update t_act set balance = balance - 10000 where actno = 'act-001';update t_act set balance = balance + 10000 where actno = 'act-002';
以上两条DML语句必须同时成功,或者同时失败,不允许出现一条成功、一条失败。
要想保证以上两条DML语句同时成功或者同时失败,就需要使用数据库的“事务机制”。
因为它们这三个语句都是和数据库表当中的“数据”相关的。
事务的存在是为了保证数据的完整性、安全性。
不需要事务机制。
但实际情况不是这样的,通常一个“事儿(事务【业务】)”需要多条DML语句共同联合完成。
假设一个事儿,需要先执行一条INSERT,接着执行一条UPDATE,最后执行一条DELETE,这个事儿才算完成。
开启事务机制:
这些操作都会记录到数据库的操作历史中,但不会真正修改硬盘上的数据。
提交事务或回滚事务(结束):
commit
rollback
TCL(事务控制语言)可以设置一个保存点,让其回滚到某个地方。
事务包括四大特性:ACID
事务隔离性存在隔离级别,理论上隔离级别包括4个:
读未提交(read uncommitted)
读已提交(read committed)(默认)
可重复读(repeatable read)
序列化读/串行化读(serializable)
MySQL数据库默认隔离级别是:可重复读。
MySQL事务默认情况下是自动提交的。只要执行任意一条DML语句,则提交一次。
怎么关闭自动提交?
start transaction;
设置事务的全局隔离级别:
set global transaction isolation level read uncommitted;
查看事务的全局隔离级别:
select @@global.tx_isolation;
事务1:
mysql> start transaction;mysql> select * from t_user;
在这之间事务2插入了一条数据smith。
事务2:
mysql> start transaction;mysql> insert into t_user(username) values("SMITH");
结果:
设置事务隔离级别为读已提交:
set global transaction isolation level read committed;
事务1:
mysql> start transaction;mysql> select * from t_user;
在这之间事务2插入了一条数据。
事务2:
mysql> start transaction;mysql> insert into t_user(username) values("test");mysql> commit;
结果:
设置事务隔离级别为可重复读:
set global transaction isolation level repeatable read;
事务1:
mysql> select * from t_user;
在这之间事务2对数据进行了无数次修改并进行了提交。
事务2:
mysql> select * from t_user;
结果:
设置事务隔离级别为串行化读:
set global transaction isolation level serializable;
事务1:
mysql> start transaction;mysql> select * from t_user;mysql> insert into t_user(username) values('hehe');
此时,事务1还未提交。
事务2:
mysql> start transaction;mysql> select * from t_user;
结果:
通过这些演示可以看出,事务的隔离级别直接影响到事务的安全性和效率。
转载地址:http://arbfk.baihongyu.com/