Spring事务处理
Mysql事务处理
-
mysql中的事务
事务的四大特性:原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability),也称作(acid)
Mysql中只有Innodb数据库引擎才支持事务,Mysql默认以自动提交的方式运行。
-
事物的并发问题
- 脏读

即某个事务中读取了在数据库缓存中的数据,解决方法:就是不允许事务去访问其他事务的缓存,只能去访问公共数据。
- 不可重复读

即:当同一个事务,在读取同一个表中同一行数据的某一个属性时,两次读取的数值不一样,解决办法:可以设置一个行级锁,当一个事务在读取某一个行时,不允许其他事务对该行进行操作。
- 幻读

即:当某个事务查询整张表时,发现多出来的信息,注意区别于不可重复读,幻读产生主要是因为插入导致而不可重复读由于修改导致,解决办法:设置一个表级锁,当一个事务在操作一张表时,锁住该表,不允许其他事务对该表进行操作。
- 事务的隔离级别

jdbc事务处理
- Jdbc的执行流程:1.加载驱动,2.创建连接,3.创建语句,4.执行语句;在这个过程中,一个连接即可以封装成一个事务
范例代码,如下:
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection connection = null;
try {
connection = DriverManager.getConnection(url, userName, password);
connection.setAutoCommit(false);
Statement statement = connection.createStatement();
statement.execute("insert into orders values('100002', '100004', 2, 2499, now(), null, null, '程明杨', '13576768787', '西安', '代发货')");
statement.execute("update products set stock = stock - 2 where id = '100004'");
statement.close();
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
Spring事务处理
- spring事务处理中最主要的几个接口

PlatformTransactionManager 用于生成一个事务,同时传入一个TransactionDefinition参数,用于表示,生成一个什么样的事务,创建出来的事务就是TransactionStatus类型,即可以认为:TransactionDefinition表示定义一个什么样的事务,TransactionStatus表示创建好的正在运行的事务。 PlatfromTransactionManager同时拥有一些实现类,如:DateSourceTransactionManager:若持久层使用 jdbcTemplate、mybaties等等则选择该管理器;HibernateTransactionManager: 若持久层使用的是Hibernate,则使用该管理器; JpaTransactionManager: 若持久层用的是jpa模式,则使用该管理器;
spring中的事务一般用在业务层,即Service层,因为只有在这一层,才会将一些列持久层的操作封装起来进行操作。
- 什么是事务的传播行为:(为了解决业务层方法之间的互相调用的事务问题)
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:
public class Propagation {
// 当有两个方法,一个a方法,一个b方法,若两个方法都属于各自的事务中,当a事务中调用了b方法,
// 同时b方法也属于一个事务,那么这时候就要看事务的传播行为,来决定了,具体如下:
// PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务就新建一个事务。这个最常用
// 意思是:如下面的例子,如果a方法是一个事务,且a事务中调用了b方法,那么b方法就会加入a事务当中,
// 如果当前a方法中没有事务,那么b自己会创建一个事务,自己就是一个事务
// 同理还有很多其他的事务传播行为,就不一一列举
public void a() {
// begin
// 步骤
b();
// commit
}
public void b() {
// begin
// 步骤
// commit
}
}
spring事务处理机制有哪几种方式
1.编程式事务处理
- 基于底层API的方法
- 基于TransactionTemplate方式
2.声明式事务处理
- 基于TransactionInterceptor的方式
- 基于TransactionProxyFacotoryBean的方式
- 基于<tx>命名空间的方式
- 基于@Transactional注解的方式
其中5,6两种方式是推荐的,也是被经常使用的。详细可以见项目中如何使用
1741

被折叠的 条评论
为什么被折叠?



