1、MySQL是单进程多线程(而Oracle等是多进程),也就是说MySQL实例在系 统上表现就是一个服务进程,即进程,(通过多种方法可以创建多实例,再安装一个端口号不同的mysql,或者通过workbench来新建一个端口号不同的 服务器实例等),该架构类似于SQL Server和Windows版本的Oracle;
2、MySQL实例是线程和内存组成,实例才是真正用于操作数据库文件的(MySQL数据库是由一些列物理文件组成,类似于frm、MYD、MYI、ibd结尾的文件);
3、一般情况下一个实例操作一个或多个数据库(Oracle一个实例对应一个数据库);集群情况下多个实例操作一个或多个数据库。
注:在实例启动的时候MySQL会读取配置文件,类似于Oracle的spfile文件,不同的是Oracle如果找不到参数文件会启动失
败,MySQL如果找不到配置文件则会按照默认参数设置启动实例。
—————————————————————————————————————————————————————————————————————————————
mysql中database、instance、session:
mysql中建立一个会话,不是和具体的数据库相连接,而是跟某个instance建立会话(每个会话可以使用不同的用户身份)。
而一个实例可以操作多个数据库,故一个会话(在操作系统概念里,会话即是线程)可以操作一个实例上的多个数据库。
简单描述如下:instance >> database
—————————————————————————————————————————————————————————————————————————————
connection和session的定义和区别:
1.连接(connection)是一个物理的概念,它指的是一个通过网络建立的客户端和专有服务器(Dedicated Server)或调度器(Shared Server)的一个网络连接。
2.会话(session)是一个逻辑的概念,它是存在于实例中。
注:创建一个连接(connection)实际上是在某个实例(instance,或者说是进程)中创建一个或多个线程。
两者关系:
- 1、一个连接可以拥有多个会话也可以没有会话(实际上,一条连接上的各个会话可以使用不同的用户身份),同一个连接上的不同会话之间不会相互影响。
- 2、 两个会话之间的影响,体现在锁和锁存,即对相同资源的操作(对象定义或数据块)或请求(CPU/内存),它们的处理一般是按队列来处理的,前面的没有处理 好,后面的就要等待。如果以打电话来比喻:connect就好比你接通对方,这时,connect就建立了,有没有通话,不管。双方进行通话,则 session建立了,如果换人,则新的session建立,原session结束,类似的,可以在同一个connect上进行多个会话。最后,挂 机,connect结束。
—————————————————————————————————————————————————————————
1、会话可以创建多个事务
比如:使用客端连接数据库,这样你就可以执行很多个事务了
2、一个事务只能由一个会话产生
在数据库里的事务,如果在执行的SQL都是由会话发起的,哪怕是自动执行的JOB也是由系统会话发起的
3、一个事务可能会产生一个或多个线程
比如RMAN备份,是可以创建多个线程可加快备份速度
4、一个线程在同一时间内只能执行一个事务
而一个线程,在没结束当前事务是无法释放资源来执行第二个事务
—————————————————————————————————————————————————————————
事务、会话与线程的关系和区别:
事务:简单理解局势一个业务需求的最小处理单位。
如:从A银行卡转账500元到B银行卡,事务就包括两部分,1、从A卡减掉500元 2、从B卡加上500元
这两个部分只要一个部分出错,就要整体“回滚”,那这就是一个事务
会话:可以包含N个事务
如:你登陆网银之后,可以重复转账步骤2次,第二次转账失败,并不影响你第一次转账成功。
注:一个会话中可以由多个事务。线程是操作系统概念。
mysql实例(instance):
MySQL是单进程多线程,也就是说MySQL实例在系 统上表现就是一个服务进程,即进程,就是我们在自己电脑布了一个mysql实例(服务),然后我们在代码中就可以通过配上mysql实例的地址,就能连上自己电脑上的这mysql实例.
数据库database:
一个instance下可以包含很多个database,如下图: 我的本地的一个instance包含了7个database.
connection
是将两个服务通过网络建立起连接, 指的是jdbc和mysql实例建立连接,
spring整合mybatis后,由Hikari连接池来完成concection的操作
SqlSession
sqlsession是一个会话,是jdbc和mysql实例的一次通话, 背景是spring整合mybatis后,
SqlSession是Mybatis工作的最顶层API会话接口,所有的操作都经由它来实现.
4个单独的dao操作,就是4个事务,就会有4个sqlsession被创建和关闭
将4个dao操作圈在一个事务中,就会只有一个sqlsession被创建和销毁.
就是一个事务只能对应一个sqlsession, 一个sqlsession也只能对应一个事务????
注意:必须dbc和mysql实例先建立连接concection, sqlsession才能执行后续操作.
本地事务
就是一个事务访问的是同一个instance,这就是本地事务.
也就是说, 我在一个事务里访问了同一个instance里的A数据库database,又访问量这个instance里的B数据库database,我访问同一个instance不同database了,这时候我因为我是对同一个instance访问的,因此这种操作仍然叫做本地事务.
(这种同一instance跨database的操作,mysql自己是怎么保证它的事务成功的, 后续可以研究下原理)
同一个本地事务
就是在满足本地事务的基础上, 几个dao操作要被圈在一起,圈在一个事务里,如下:
4个dao操作访问的都是同一个instance, 而我又把它们放到同一个方法中用@transactional注解把它们圈在一个事务中, 现在这4个dao就在同一个本地事务中.