MyBatis学习(三)

MyBatis中的连接池、事务的使用

1.1连接池

我们在实际开发中都会使用连接池,因为它可以减少我们获取连接所消耗的时间

1.2MyBatis中的连接池

MyBatis连接池提供了三种配置:
配置的位置:主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。
type属性的取值
POOLED 采用传统的javax.sql.DataSource中的连接池,MyBatis中有针对规范的实现
UNPOOLED 采用传统的获取连接的方式,虽然也实现javax.sql.DataSource接口,但是并没有使用池的思想
JNDI 采用服务器提供的JDNI技术实现,来获取DataSource对象,不同的服务器所能拿到的DataSource是不一样的。注意:如果不是web或者maven的war工程,是不能使用的。由于我使用的是Tomcat服务器,采用连接池是dbcp连接池(了解)
type=“POOLED” 时,日志记录的信息如下:
MyBatis学习(三)_第1张图片根据日志信息可见,该方式使用的连接是从数据库连接池中获取的,使用结束后将连接归还给连接池。
type=“UNPOOLED” 时,日志记录的信息如下:
MyBatis学习(三)_第2张图片根据日志信息可见,该方式是直接创建一个连接,使用结束后关闭连接

2.1MyBatis中的事务

1.事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
2.事务的四大特性(ACID)
原子性(Atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(Consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(Isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰.
持久性(Durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
3.不考虑隔离性会产生的三个问题
脏读: 一个事务读到另一个事务未提交的数据。
如:转账问题:a转b100;首先执行b+100;这时另一个事务读取b的钱多了100,但是只要原来的事务不提交,b就会回滚,这就是脏读。
不可重复读: 在一个事务里面读取了两次某个数据,读出来的数据不一致
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据
幻读: 在一个事务里面的操作中发现了未被操作的数据
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
解决方法为设置四种隔离级别:
读未提交: 事务未提交的数据可以读。什么问题都解决不了
读已提交: 读取已经提交了的数据,可以防脏读,不能防不可重复读和幻读。
可重复读: 读一个数据时,上锁。期间不让其他事务做删除修改操作
串行化: 直到一个事务的所有子事务全部结束才可以执行下一个事务。

MyBatis中,是通过SqlSession对象的commit方法和rollback方法实现事务的提交和回滚

1.设置自动提交:

SqlSession sqlSession=sqlSessionFactory.openSession(true);

2.设置手动提交:

SqlSession sqlSession=sqlSessionFactory.openSession(true);
sqlSession.commit();

你可能感兴趣的:(MyBatis学习)