欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

事务---关于事务的一系列知识

程序员文章站 2024-03-20 21:23:10
...

事务—关于事务的一系列知识(当然,有事务,就会和线程分不开啦~)

其实在mysql数据库中,唯一能够提供事务功能的引擎,便是innodb,其余的
包括myisam,黑洞引擎,内存引擎,都不支持事务操作。当然选择什么样的引擎
还是要看想要实现什么样的业务,例如你想要实现日志服务器,那么你就用黑洞引擎,
你先要提高查询的效率,但是并不在意事务上的操作,那么你就用myisam,如果你
数据量很少,那么就用内存引擎,随便你,啊哈哈哈哈。好像说跑偏了~~~

什么是事务?

    事务是作为单个逻辑工作单元执行的一系列操作;
	这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;
	事务是一组不可再分割的操作集合(工作逻辑单元);

事务的四大特性ACID?

特性 英文
原子性 Atomicity
一致性 Consistency
隔离性 Isolation
持久性 Durability

(具体的不再阐述)本身新进开发一枚,阅历不深,多多指教。

事务提交的三种方式?

包括:显式提交,隐式提交,自动提交。
其中:
	显式提交也就是commit
	隐式提交是:SQL命令间接完成的提交为隐式提交,隐式提交不能回滚
	自动提交:AUTOCOMMIT设置为ON

事务七大传播机制?

	1.required	   如果当前没有事务,就新建一个事务,
				   如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
	2.supports	   支持使用当前事务,如果当前事务不存在,则不使用事务。
	3.mandatory    中文翻译为强制,支持使用当前事务,如果当前事务不存在,则抛出Exception。
	4.requires_new 创建一个新事务,如果当前事务存在,把当前事务挂起
	5.not_supported无事务执行,如果当前事务存在,把当前事务挂起。
	6.never        无事务执行,如果当前有事务则抛出Exception。
	7.nested       嵌套事务,如果当前事务存在,那么在嵌套的事务中执行。
				   如果当前事务不存在,则表现跟REQUIRED一样。

事务四大隔离级别?

1.读未提交  Read Uncommited 
    这是事务最低级的隔离级别,会引起脏读,不可重复度,以及幻读
    说白了,就是一个事务可以读到另外一个事务未提交的数据
2.读已提交  Read Commited
    这种隔离级别避免了脏读,但是还是会引起不可重复读,以及幻读
    那么为什么避免了脏读呢?
    这是因为,当开启读已提交时,一个事务要等待另外一个事物提交后,才能进行读取操作。
    但是!!!当两次同样的查询操作,查询出的两次结果是不同的,因为当中允许修改操作,故会引起不可重复读
3.可重复度	Repeatable read
    这种隔离级别避免了避免了脏读,不可重复读
    也就是当两次同样的查询操作,中间不在允许修改数据操作,故可以避免了不可重复读
4.序列化	Serializable 
	最可靠的事务隔离级别(还可以解决幻读的问题)
	幻读的问题也就是两个事物之间发生的insert操作

扩展

我们的数据库,例如mysql是可以支持事务的,DML语句要嘛会进行提交,当然也可以进行回滚,那么是什么保证的呢?

  当然我们在进行更新操作的时候,所有的dml操作,数据库底层都会保存一个东西,那就是该数据的日志。
  当然,大家放心,数据库在进行修改数据的时候,一定会将对应的日志保存到日志中,且会在保存日志后,
再进行对应的删	除,更新之类的操作,这样保证了一个数据库的事务能力。
  当然,当事务发生回滚的时候,会对原有数据进行覆盖,这种覆盖,我们可以起个名字,就叫做操作的幂等性,
无论对事务回滚多少次,重复的覆盖,仍然会是原来的数据。

那我再讲讲,数据库是什么东西呢?
  其实很早之前,我们的无纸化办公,是对于文件的操作,那时候还没有数据库,对于文件的直接操作(即数据),
便是我们的日常办公,但是对于存储数据的文件,有着很大的不确定性或者说是弊端:
1.无法完成同样文件数据的同步。
2.当查询内容的时候,例如及格的人数,最高的分数等等,都会给工作者造成过多的麻烦。
3.不同办公软件对于文件的解析方式是不同的,有些并不支持跨平台
那么,就有人提出了:为何不在我们的原本操作(应用层)与文件层之间添加一层抽象层,来确保我们能够解决
如上问题嘛!
自此,数据库的基本雏形,开始呈现,当然会随着人们对于需求的不同,数据库本身还会增加例如事务,添加权限等。
最后添加一句,对于java最新引入与数据库达成协议(JDBC)的是mysql