1.什么是事务
一个数据库事务由一条或者多条sql语句构成,它们形成一个逻辑的工作单元。这些sql语句要么全部执行成功,要么全部执行失败
事务是保证数据的完整性和一致性的重要手段
事务类型
DML事务:由一条或者多条DML语句构成
DDL事务:总是由一条DDL语句构成
DCL事务:总是由一条DCL语句构成DML事务:有一条或多条DML语句构成
2.事务的四个特性
ACID
原子性:事务操作时最小的操作单元,操作要么成功,要么失败
COMMIT 提交 : 让缓存里的数据写到磁盘
ROLLBACK 回滚 :撤销缓存中的操作
一致性:事务执行结果必须是从一个一致性状态到另个一个一致性状态
隔离性:每个事务之间互相是不会被干扰的
持久性:事务一旦提交,他对数据库数据库改变时永久的,事务的操作会永久落盘
MVCC:多版本并发控制 --》大并发操作的时候,提高读写的性能,能保存数据的一致性 --行锁、事务
3.事务的开始与结束
有一个变量 autocommit =1 ,这个变量存在的意义是每当你执行sql语句,mysql将你执行的sql语句自动提交
当时在执行DDL、DCL语句的时候,就算你关闭了autocommit也不会影响,因为他会在你执行之前,自动执行一句commit语句
隐形开始与显性开始
隐性开始:
隐性开始就是当你提交事务时,mysql语句会自动提交commit操作,不需要你手动进行
显性开始:
当你输入start transcation;后,当你执行mysql语句后,执行结果只是保存在你这个事务的buffer pool里,而没有落盘,(事务的隔离性),并且sql查询时时直接查询磁盘的数据,这就导致别的mysql连接用户查询不到你刚刚执行的操作,你需要再执行一句commit; 让事务落盘(持久性)(或者rollback 将语句撤销),这样别人才会访问到你执行的事务操作,但是当执行完后,下一条数据库语句会自动回归隐性开始
SavePoint
SAVEPOINT a;
简历保存点,当你需要回滚时,直接 rollback to a 这样就回到了a时的操作
savepoint a;
insert into t3 values(3,'cali')
rollback to a;
这样就会就会回到插入之前的状态
5、脏读、脏数据
脏数据:被事务修改后但是没有被提交的数据
胀读:一条事务可以查看另一条数据没有执行的数据
这些操作都是在内存中进行
6、锁
死锁: 比如访问某个资源需要两个条件,A事务持有一个条件,B事务持有另一个条件,这样资源被占用了两个都不满足放问
如何预防死锁
1.使用另外的程序来检查是否存在死锁,干预,杀死某些进程
2.设计程序的时候,考虑获得
3.队列
活锁:活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。处于活锁的实体是在不断的改变状态,活锁有可能自行解开。
读锁: 读数据的时候,给每行加一个锁,读锁就是共享锁,当前会话与其他会话可以读表但是不能修改表
写锁: 写数据的时候,给某行加一个锁,写锁是互斥锁,在写未释放之前,既不能读也不能写
意向锁:
共享锁: ---> 读锁
互斥锁: ---> 写锁
锁的意义:大并发的情况下,为了保存数据的一致性。需要对资源进行管控,需要使用锁,解决资源竞争问题
select * from t2 lock in share mode ;
7.并发事务引发的4个问题
脏读:事务读取到另一个事务未提交的数据
不可重复读:update和replace造成,事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
幻读 :insert和delete造成、两次查询的条数不一样
例子:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
丢失更新:两个事务同时对一个数据进行更新,然后提交的时候先提交的被后提交的覆盖
8.隔离级别
每个事务都有一个隔离级别(isolation level),它规定了并发运行的两个事务之间是否允许发生上面的问题
read uncommitted
read committed
repeatable read
serializable :
两种查看隔离级别的方式:
select @@global.tx_isolation,@@tx_isolation
show variables like '%tx_isolation%'
table read
serializable :
两种查看隔离级别的方式:
select @@global.tx_isolation,@@tx_isolation
show variables like ‘%tx_isolation%’