** 事务**
1、 定义:
事务是一组原子性的sql命令或者说是一个独立的工作单元,如果数据库引擎能够成功的对数据库应用该组的全部sql语句,那么就执行该组命令,如果其中有任何一条语句因为崩溃或者其它原因无法执行,那么该组中所有的sql语句都不会执行,如果没有显示启动事务,数据库会根据autocommit的值。默认每条sql操作都会自动提交。
开启事务BEGIN,事务回滚ROLLBACK,事务确认COMMIT。
2、特性:
原子性:或者全部完成或者全部失败;
一致性:我们数据库在进行事务改动的时候,前后不能破坏我们的数据库制约;
隔离性:就是我们的数据库对应的事务操作不能相互影响;
持久性:在我们commit后,对应的数据应该持久化,只要commit之后,就不能丢数据。
3、 Mysql的四个隔离级别:
读未提交(read-uncommitted)、不可重复读(read-committed)、可重复读(repeatable-read)、串行化(serializable)。
【扩展】JDBC怎么维护的事务
JDBC的数据库操作中,一项事务是由一条或是多条表达式所组成的一个不可分割的工作单元。我们通过提交commit()或是回退rollback()来结束事务的操作。关于事务操作的方法都位于接口java.sql.Connection中。
首先我们要注意,在JDBC中,事务操作默认是自动提交。也就是说,一条对数据库的更新表达式代表一项事务操作。操作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回退。
其次,在JDBC中,可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交。倘若其中一个表达式操作失败,都不会执行到commit(),并且将产生响应的异常。此时就可以在异常捕获时调用rollback()进行回退。这样做可以保持多次更新操作后,相关数据的一致性。
【扩展】Spring怎么维护的事务
Spring事务的本质是对数据库事务的封装支持,Spring本身无法提供事务管理功能。
实现方式共有两种:编码方式;声明式事务管理方式。
1、编程式事务管理:
Spring提供两种方式的编程式事务管理,分别是:使用TransactionTemplate和直接使用PlatformTransactionManager。
2、基于AOP技术实现的声明式事务管理,实质就是:在方法执行前后进行拦截,然后在目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务。
声明式事务管理又有两种方式:基于XML配置文件的方式;另一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
对比:
(1)编程式事务管理:编程式事务管理需要将事务管理代码嵌入到业务方法中来控制事务的提交和回滚事务和业务代码耦合度太高。
(2)声明式事务管理:侵入性小,把事务从业务代码中抽离出来,使用AOP配置到配置文件中,降低代码之间的耦合度,提高了维护性。
【扩展】Mybatis怎么维护的事务
MyBatis的事务管理分为两种形式:
1、使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等;
2、使用MANAGED的事务管理机制:这种机制MyBatis自身不会去实现事务管理,而是让程序的容器来实现对事务的管理。
如果底层使用JDBC(在mybatis.xml中配置的transactionManager标签的type设为jdbc的话),mybatis会默认开启事务,也就是说,mybatis默认是关闭自动提交的。在Mybatis中,如果我们执行了数据库的修改操作(insert、update、delete),必须调用session.commit()方法,所做的修改才能持久化到磁盘。
MyBatis可以通过XML配置是否独立处理事务,可以选择不单独处理事务,将事务托管给其他上层框架如spring等。MyBatis自动参与到spring事务管理中,无需额外配置。