MySQL事务的相关问题
Posted ZQ1420803426
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL事务的相关问题相关的知识,希望对你有一定的参考价值。
什么是数据库事务
事务,一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在计算机术语中,事务通常就是指数据库事务。
数据库事务存特性
1.原子性:在事务的执行过程中一旦执行到某一步骤时发生了问题,就需要执行回滚操作,那么之前所作的所有操作都需要回滚到事务执行之前的状态,简单说就是要么所有步骤都完成要么所有步骤一起失败
2.一致性:在转账之前,A和B的账户中共有500+500=1000元钱。在转账之后,A和B的账户中共有400+600=1000元。也就是说,数据的状态在执行该事务操作之后从一个状态改变到了另外一个状态。同时一致性还能保证账户余额不会变成负数等。
3.隔离性:在A向B转账的整个过程中,只要事务还没有提交(commit),查询A账户和B账户的时候,两个账户里面的钱的数量都不会有变化。 如果在A给B转账的同时,有另外一个事务执行了C给B转账的操作,那么当两个事务都结束的时候,B账户里面的钱应该是A转给B的钱加上C转给B的钱再加上自己原有的钱。
4.持久性:一旦转账成功(事务提交),两个账户的里面的钱就会真的发生变化(会把数据写入数据库做持久化保存)!
关于事务的定义有几点需要注意:
-
1.数据库事务可以包含一个或多个数据库操作,但这些操作构成一个逻辑上的整体。
-
2.构成逻辑整体的这些数据库操作,要么全部执行成功,要么全部不执行。
-
3.构成事务的所有操作,要么全都对数据库产生影响,要么全都不产生影响,即不管事务是否执行成功,数据库总能保持一致性状态。
-
4.以上即使在数据库出现故障以及并发事务存在的情况下依然成立。
如何实现数据库事务
在事务的ACID特性中,C即一致性是事务的根本追求,而对数据一致性的破坏主要来自两个方面
-
1.事务的并发执行
-
2.事务故障或系统故障
数据库系统是通过并发控制技术和日志恢复技术来避免这种情况发生的。
并发控制技术保证了事务的隔离性,使数据库的一致性状态不会因为并发执行的操作被破坏。 日志恢复技术保证了事务的原子性,使一致性状态不会因事务或系统故障被破坏。同时使已提交的对数据库的修改不会因系统崩溃而丢失,保证了事务的持久性。
事务的操作
1、用 BEGIN,ROLLBACK, COMMIT来实现
-
begin 开始一个事务
-
rollback 事务回滚
-
commit 事务提交
BEGIN; -- 开始事务
select * from t1;
insert into t1 VALUES('1','张三','100');
insert into t1 VALUES('2','李四','100');
UPDATE t1 set money = money-10 where id ='1'; -- 更新数据 张三借出10块钱
UPDATE t1 set money = money+10 where id ='2'; -- 更新数据 李四获得10块钱
ROLLBACK; -- 事务回滚
COMMIT; -- 提交事务
事务的隔离等级
-
读未提交(READ UNCOMMITTED):能读取到其他事务未提交的数
-
读已提交(READ COMMITTED):只能读到其他事务已提交的数据
-
可重复读(REPEATABLE READ):事务A在同一事务的不同时间段内,读取同一行数据,得到的值一样(即便其他事务修改了值)
-
串行化(SERIALIZABLE):事务一次执行,不存在并发问题
事务的隔离级别越低,可能出现的并发异常越多,但是通常而言系统能提供的并发能力越强。
并发事务处理带来的问题
-
更新丢失(Lost Update) 当两个或多个事务选择同一行,然后基于最初选定的值更新改行时,有于每个事务都不知道其他事务的存在,就会发生更新问题:最后的更新覆盖了由其他事务所做的更新。
-
脏读(Dirty Reads) 一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致的状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此进一步的处理,就会产生未提交的数据依赖关系。这种现象被称为“脏读”。 事务A读取到事务B已经修改但未提交的数据,还在这个数据基础上做了修改。此时,如果事务B回滚了,事务A的数据无效,不符合一致性要求。
-
不可重读(Non-Repetable Reads) 一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现起读出的数据已经发生了改变、或某些记录已经被删除。这种现象叫做“不可重读”。 事务A读取到了事务B已经提交的修改数据,不符合隔离性。
-
幻读(Phantom Reads) 一个事务按照相同的查询条件读取以前检索过的数据,却发现某些事务插入了满足其查询条件的新数据,这种现象称为“幻读”。 事务A读取了事务B提交的新增数据,不符合隔离性。
以上是关于MySQL事务的相关问题的主要内容,如果未能解决你的问题,请参考以下文章