首页 > 编程知识 正文

简述事物的定义和特性,数据库中事物的概念

时间:2023-05-06 01:50:56 阅读:150576 作者:2211

事务概念事务处理(transaction ) :最小、不可分割的工作单位。通常,一个事务处理对应于一个完整的业务。 例如,银行转帐业务是最小的工作单位

事务只与DML语句有关,或者只有DML语句具有事务。

在事情正在进行、还没有结束的时候,DML语句不更改基础数据,只是记录历史操作,并在内存中完成记录。 只有在事情结束且成功结束时,才修改基础硬盘文件中的数据。

在MySQL中,缺省情况下事务为自动提交

事务的基本要素(ACID )原子性(Atomicity))事务开始后的所有操作,要么全部做完,要么全部不做,不会中途停滞。 如果在执行事务时发生错误,则会回滚到事务开始之前的状态,就像没有发生所有操作一样。 这意味着事务是不可分割的整体,同一事务中的多个语句是不可分割的。一致性(Consistency):在事务开始之前和结束之后,数据库完整性约束未更改。 例如,假设a向b汇款,a扣了钱,b却不可能没有收到。隔离性(Isolation)在多线程环境中,这意味着一个线程的事务不会被其他线程的事务干扰。 例如,a正在从银行卡取钱。 在a取钱的过程结束之前,b不能把钱转账到这张卡上。持久性(Durability):事务完成后,事务对数据库的所有更新都将存储在数据库中,无法回滚。 的并发问题脏读:意味着一个线程的事务读取了另一个线程的未提交数据。 例如,若线程a读取线程b更新前的数据,然后b回滚操作,则a读取的数据为脏数据。

示例:

痴情的蜡烛工资是5000,事务a把他的工资改为8000,事务a还没有提出。 与此同时,事务b正在读取痴情的蜡烛工资。 痴情蜡烛的工资是8000。 之后,事务a发生了异常,回滚了事务。 痴情的蜡烛工资又回滚到了5000。 最后,事务b读取的痴情蜡烛工资为8000的数据是脏数据,事务b进行脏读取。

不可重复读表示一个线程的事务读取了在另一个线程上提交的更新数据。 具体来说,就是在一个事务中多次读取同一数据。 在此事务尚未结束时,另一个事务也会访问此数据。 如果在第一个事务中两次读取的数据之间,第二个事务可能修改了该数据,则第一个事务两次读取的数据不同。 在一个事务中前后两次读取的结果不一致,无法重复读取。

例如,由于线程a多次读取同一数据,线程b在事务a多次读取期间更新并提交了数据,所以事务a多次读取了同一数据的情况下,结果不一致。

示例:

在事务a中,读取痴情的蜡烛工资为5000,操作没有完成,事务还没有提交。 与此同时,事务b将痴情蜡烛的工资改为8000,提交给了事务b。 之后,在事务a中,再次读取痴情蜡烛的工资,此时的工资为8000,两次读取的结果不一致。

幻读表示一个线程的事务读取了在另一个线程上提交的insert数据。 看起来像幻觉。 例如,幻读提示已存在一条记录,该记录在当前事务的查询中没有此结果,但在当前事务中应该可以执行新操作,但无法在记录中插入同一主键。 例如,第一个事务完全更新表中的数据,第二个事务在表中插入一行新数据。 执行后,第一个事务的用户注意到表中的另一条记录没有成功更新。 仿佛发生了幻觉,这也是幻读。

示例:

目前,工资为5000的员工有10人,事务a读取所有工资为5000的人数时为10人。 此时,事务b插入工资也为5000的记录。 此时,事务a再次读取工资为5000的工作人员,记录为11人。 这时产生了幻读。

注意:不可重复的和虚幻的容易混淆,不可重复的侧重修改,虚幻的侧重添加或删除。 要解决不可重复的问题,只需锁定满足条件的行,而要解决幻读,则需要锁定表。

事务相关术语开放事务: Start Transaction,执行任何DML语句(insert、update、delete )。 表示事务开始和结束的事务:结束提交事务:提交事务:回滚事务:回滚锁定悲观锁定:所有不同的锁定如果一个事务正在处理数据,其他事务将无法处理该数据。乐观锁定:大多数操作都不应锁定,假设所有不同事务的处理都将发生干扰,但既然同时发生,则为干扰锁定乐观锁在提交更新请求之前,会先阅读此数据,然后检查此数据是否发生了变化。 如果有变化,就放弃这次的提交,如果没有变化就可以提交。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。