MySQL数据库事务学习

什么是数据库事务?

事务由作为一个单独单元的一个或多个SQL语句组成。这个单元中的SQL语句是相互依赖的,整个单元是不可分割的。如果单元中的一个语句不能完成,整个单元就会回滚(撤销操作),所有影响到的数据将返回到事务开始以前的状态。(银行交易、网上购物等)
一个事务经过一个或多个步骤完成,且事务的多个步骤之间具有先后关系(逻辑上的或者自定义的),如果在执行到事务的某个步骤时,发生了错误,则必须复原事务开始之前的现场,重新开始事务,一次保证数据库的安全性。

数据库正确实现的事务管理(ACID)

**A:原子性(Atomicity)**:事务是一个或多个行为捆绑在一起组成一个单独的工作单元,事务中的动作要么都发生,要么都不发生.
**C:一致性(Consistent)**:即在事务开始之前和结束之后,数据库的完整性约束没有被破坏.
**I:隔离性(Isolation)**:指的是在并发环境中,事务之间互相影响的程度(即并发事务间数据的可见程度).由并发事务所做的修改必须与任何其他并发事务所做的修改隔离.
**D:持久性(Durability)**:一旦事务完成,事务的结果应该持久化,用来保证即使系统崩溃也不会破坏事务的结果.
多个用户同时对数据库操作进行操作时,就需要对事务进行并发控制。

事务并发产生的问题

丢失修改:两个不同的事务同时获得了相同的数据,又都对这个数据进行了修改,那么先提交的事务的更新就会被后提交事务的更新覆盖掉.
例如:两个事务都要更新数据库一个字段X, X=100;
丢失修改
脏读(未提交读) :一个事务正在访问数据,而其他事务正在更新该数据,但尚未提交,此时会发生脏读问题,即第一个事务所读取的数据是“脏”的。
例如:数据库一个字段X, X=100;
脏读
不可重复读:在一个事务内多次读同一数据,在该事务还没有结束时,另外的事务也访问该数据并对其做修改,从而导致第一个事务两次读取的数据不一样。
例如:数据库一个字段X, X=100;
不可重复读
幻读:有两种情况
(1):事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按照相同条件读取数据时,发现某些记录神秘的消失了.
(2):事务T1按一定条件从数据库中读取了某些数据记录后,事务T2插入了一些记录,当T1再次按照相同条件读取数据时,发现多了一些记录.

数据库隔离级别

数据库利用加锁和阻塞来保证事物之间不同等级的隔离性,从而实现事务的互不干扰的访问和操作数据库.
四级隔离级别:定义用户之间隔离和交互的程度

读未提交(read uncommitted):可以读到其他事务还没有提交的数据,但不允许丢失修改,会导致大量数据变化。一级封锁协议
读已提交(read committed):可以看到其他事务添加的新纪录,而且其他事务对现存记录做出的修改一旦被提交,也可以看到,避免丢失修改和脏读。二级封锁协议
可重复读(repeatable read):当前在执行的事务的变化无法被看到,同一事务中执行select数次结果都相同,避免丢失修改、脏读和不可重复读。增强的二级封锁协议
可串行化(serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行,避免所有并发控制问题。三级封锁协议

四级隔离解决并发问题

隔离级别

MySQL数据库事务相关

#查看mysql隔离级别

Show variables  like ‘tx_isolation’;

#设置mysql隔离级别

#读未提交
set global transaction isolation level read  uncommitted;
#读已提交
set global transaction isolation level read  committed;
#可重复读
set global transaction isolation level repeatable read;
#可串行化
set global transaction isolation level serializable;

事务过程
START TRANSACTION;
事务的执行步骤(CURD)/设置回滚点(SAVEPOINT +回滚点名称)
COMMIT/ROLLBACK(完全回滚)/ROLLBACK TO +回滚点名称

autocommit

set autocommit=0指事务非自动提交,自此句执行以后,每个SQL语句或者语句块所在的事务都需要显示"commit"才能提交事务。Autocommit属性默认为1,默认设置后仅对当次登录有效。
1、不管autocommit 是1还是0
START TRANSACTION 后,只有当commit数据才会生效,ROLLBACK后就会回滚。
2、当autocommit 为 0 时
不管有没有START TRANSACTION。
只有当commit数据才会生效,ROLLBACK后就会回滚。
3、如果autocommit 为1 ,并且没有START TRANSACTION 。
调用ROLLBACK是没有用的。即便设置了SAVEPOINT。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值