Mysql的事务

1.什么是事务

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

不可分割的单位。

1.1事务的特点ACID

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

C:一致性 事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。事务完成时,数据必须属于一致状态。

l:隔离性:指在并发环境中,当不同事务同时操作相同的数据时,每个事务都要各自的完整数据空间。对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的。

D:持久性:数据一旦提交,事务的效果将会被永久的保留在数据可中,而且不会被回滚

2.事务的四种隔离级别

mysql支持四种隔离级别:

1.未提交读,允许脏读,允许一个事务可以看到其他事务未提交的修改。

commit

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

3.可重复读:也是musql的默认隔离级别,确保如果在一个事务中执行两次相同的select语句时,都能得到相同的结果,不管其他事务是否提交修改,可以防止脏毒以及不可重复读

4.串行读,锁表、完全串行化,每一个事务都隔离,读写都阻塞。

3.事务隔离的范围

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';

4.隔离时发生的错误

脏读:另外一个事务能够看到另一个事务未提交的修改结果

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

幻读:一个事务对一个表中的数据进行修改,可能会涉及到表中的全部数据,另一个事务也修改了表中的数据,插入了一行新的数据。前一个事务会发现表中还有数据没有修改,类似于幻觉。

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

以上这些情况如何避免:

1.权限控制

2.根据情况来使用隔离级别

生产环境---最好是提交读和可重复读

测试环境----无所谓

3.生产还换只能允许一个人对一个事务进行操作,其他人不允许操作。

5.事务控制语句

BEGIN

start transaction 显示的开启事务

commit

commit work 提交事务

rollback 回滚

rollback work

回滚 撤销正在进行的所有未提交的修改

savepoint s1:创建回滚点,一个事务可以有多个回滚点

rollback to s1:回滚到回滚点

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