mysql的事务

f

事务时一种机制,一个操作序列 包含了一组数据库的操作命令,所有命令都是一个整体,向系统提交或者撤销的操作,妖媚都执行 要么都不执行是一个不可分割的单位

事物的特点ACID;

A:原子性 必须作为一个整体 事务里的所有条件都是一个整体,不可分割,要么成功,要么失败

A B

mysql的事务_第1张图片

2、提交读:事务只能查看已经提高的修改,未提交的修改是不可见,防止胜读 orcale sql sever

3、可重复读,也是mysql的默认隔离级别,确保如果在一个事务中执行两次相同的select语句时,都能得到相同的结果。

不管其他事务是否提交修改,可以防止脏读以及不可重复读

4、串行读,锁表,完全串行化,每一个事务都隔离,读写都会阻塞。会降低数据库的效率。

show global variables like '%isolation' 查询全局事务的隔离级别 select @@global.tx_isolation 会话事务的隔离级别 show session variables like '%isolation'; select @@session.tx_isolation;

set global transaction isolation level read uncommitted; 全局修改

set @@global.tx_isolation='read UNCOMMITTED'; 重启服务失效

set session transaction isolation level read UNCOMMITTED; 修改会话

set @@session.tx_isolation='read UNCOMMITTED';

FLUSH privileges;

不可重复读:一个事务内,多次读同一数据。 前一个事务还没有结束,另一个事务也访问该数据 在一个事务之内,两次查询到结果不一致,读不到相同的数据内容。

set global transaction isolation level read committed; set session transaction isolation level read COMMITTED;

FLUSH privileges;

begin;

update test set money=money-200 where id = 1; select * from test;

commit;

幻读:一个事务对一个表中的数据进行了修改:可能会涉及到表中的全部数据

另一个事务也修改了这个表的数据 如果插入了一行新的数据,前一个事务会发现表中还有数据 没有修改,类似于幻觉。

丢失更新:两个事务同时修改一条记录,A先记录B也修改记录,B一旦提交会覆盖A的结果

begin;

以上这些情况如何避免 1、权限控制 2、根据情况来使用隔离级别。 生产环境--最好时提交读和可重复读 测试环境--无所谓 3、生产环境只能允许一个人对一个事务进行操作。其他人是不允许操作

mysql提交事务默认自动提交

可以用set来设置mysql的提交方式: show VARIABLES like 'autocommit';

set autocommit=0; 此时不是自动提交怎么办

mysql的事务_第2张图片

mysql的事务_第3张图片

create table test (id int(4) primary key,money int(10));
flush privileges;
set global transaction isolation level read committed;
set autocommit=0;
update test set money=money-400 where id = 2;
select * from test;
set session transaction isolation level read COMMITTED;

set global transaction isolation level read committed;
set autocommit=0;
show VARIABLES like 'autocommit';
show global variables like '%isolation'

你可能感兴趣的:(mysql,数据库)