什么是事务?
事务就是一组mysql语句的组成,这些语句存在逻辑上的相关性,这一组语句要么全部成功,要么全部失败,是一个整体;mysql提供一种机制,保证达到这样的效果。这就是事务
为什么需要事务呢?
举个栗子:
就拿银行系统来讲,张三想要给李四转账三百;那么对于银行来讲,在扣除张三的三百之后,就得给李四的账户上加上三百。这就必须让这两个数据一起执行。这就引入了我们事务的应用。我们可以开启一个事务,然后提交这个事务,就可以保证这两个语句均执行掉。
好了,我们说了事务的概念和应用,那就让我们看看事务的操作把
1:开启一个事务
start transaction;2:创建一个保存点
savepoint 保存点名;3:回到保存点(根据具体情况)
rollback to 保存点名;4:提交一个事务
commit 事务名注意:innodb支持事务,myusam不支持事务
好了,接下来我们的重点来了,让我们看看事务的隔离级别
当在mysql中的表被多个线程或客户开始各自的事务进行操作时,怎样避免双方法的影响呢?mysql提供了一种机制,可以让不同的事务在操作数据库时,具有隔离性。从而保证数据的一致性。
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加读锁 |
读未提交 | √ | √ | √ | 不加锁 |
读已提交 | × | √ | √ | 不加锁 |
可重复读 | × | × | × | 不加锁 |
可串行化 | × | × | × | 加锁 |
√:会发生该问题
×:不会发生该问题
事务的隔离级别之后,让我们看看这几种读的概念:
脏读:是指当一个事务正在访问数据,并且对数据进行了更改,而这种修改还没有提交到数据库中,这时,另一个事务也能访问了这个数据,然后使用了这个数据。
不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另一个事务也访问了同一条数据;因为第一个事务对数据的修改,导致第二个事务两次对数据的读取不一致,这就是不可重复读。
幻读:是指当事务不是独立执行的时候发生的一种现象;例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据。同时第二个事务也修改这个表中的数据,这种修改是向表中插入了一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一样。
注意:不可重复读的重点是修改,幻读的重点是新增或删除
然后再让我们看看几种隔离级别:
读未提交:就是一个事务还没提交呢,另一个事务就可以看到其修改后的信息了
读已提交:就是一个事务提交之后,另一个事务就可以看到修改后的信息了
可重复读:就是一个事务提交了,另一个事务也访问不到其提交的信息
可串行化:如果需要对数据进行写操作,而有另一个事务正在访问数据库,只有等到数据1访问结束之后,才可以写入
补充几个语句:
设置事务隔离级别
set session transaction isolation level read uncommitted;查看当前的隔离级别:
select @@tx_isolation;好了,介绍完了事务的隔离级别,接下来让我们看看事务的ACID特性;
原子性:事务是应用中最小的执行单位,就如原子是自然界的最小颗粒,具有不可在分的特征一样,事务是应用中不可再分的最小逻辑执行体
一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果时,数据库处于一致性状态。如果系统运行发送中断,某个事务尚未完成而被中断,而改未完成的事务对数据库所做的修改已经被写入数据库,此时数据库就处于一种不一致的状态。因此一致性是通过原子性来保证的
隔离性:各个事务的执行互补干扰,任意一个事务的内部操作对其它并发事务都是隔离的。也就是说,并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能相互影响。
持久性:持久性是指一个事务一旦被提交,它对数据库所做的更改都要永久记录到磁盘中。
好了,以上就是阿狸对数据库事务的学习分享了,希望可以帮助到大家;若有误,请慷慨指出
















