事务主要是解决数据的原子性一致性。
事务的四大特征:
原子性:保证操作的完整性。 数据的操作动作要么完全完成,要么完全不起作用。
一致性:在事务完成之前,必须保证所有的数据都是一致的
隔离性:并发事务操作之间互不影响,在一个事务内部的操作不影响其他事务的操作,
这需要设置事务的隔离级别
持久性:当事务完成时,数据库的改变必须是持久化的
事务并发场景和问题以及解决:
当多个用户访问数据库时,这就是常见的事务并发,可能会出现的问题:
1.脏读:一个事务内部读取到另一个事务未提交的更新数据
2.不可重复读:一个事务两次读取同一行数据,两次得到数据可能不一样
3.幻读:一个事务中执行了两次查询,但是第二次查询,比第一次差的数据多了一些数据行
4.数据丢失更新:撤销事务时,把其他事务已经更新的数据给覆盖 了。
五个隔离级别:
TRANSACTION_NONE JDBC 驱动不支持事务
TRANSACTION_READ_UNCOMMITTED 允许脏读、不可重复读和幻读。
TRANSACTION_READ_COMMITTED 禁止脏读,但允许不可重复读和幻读。
TRANSACTION_REPEATABLE_READ 禁止脏读和不可重复读,单运行幻读。
TRANSACTION_SERIALIZABLE 禁止脏读、不可重复读和幻读。
而隔离级别越高,那么并发处理的性能就越差,可以使用conn.setTransactionLevel来设置隔离级别
回忆一下jdbc的事务操作:
使用时:把你涉及到对数据库的增删改操作放到try catch中
//获得连接
Connection conn = DriverManager.getConnection();
try{
//第一步先把jdbc设置为手动提交事物。
conn.setAutoCommit(false)
//操作一 增删改
//操作二 增删改
//当上面的操作不报错,就提交事物
conn.commit();
}catch(Exception e){
//当上面的操作抛异常时。就会执行事务回滚操作
conn.rollback();
e.printStackTrace();
}finally{
//把连接关闭
conn.close();
}
spring事务管理:
Spring事务管理的核心接口是:PlatformTransactionManager
事务管理接口通过getTransaction(TransactionDefinition definition)方法来根据指定的事务的传播行为来返回一个当前
活动的事务或者是创建一个新事务。事务的传播属性由TransactionDefinition这个类定义,里面有其中,默认是第一种,
-1 表示,支持当前事务,没有事务就创建一个新的事物。
spring的隔离级别也是五种,跟jdbc一一对应。
Spring配置事务管理器:
需要在 Spring与框架整合配置文件中、或者 数据持久层框架配置文件中配置事务管理器
tranactionManager。。。。
操作事务两种方式:
(1)编程式事务管理:
编程式事务管理。在配置文件中配置事务模板,和属性
在需要事务管理的地方使用 transactionTemplate对象调用 execute()方法
(2)声明式事务管理:
声明式事务分两种:
1.是基于tx:aop:命名空间的xml配置文件方式
2.是基于@Transactional注解方式
常用的就是注解方式。简单方便,直接在需要事务的地方加上注解即可