发表于: 2020-06-07 23:51:58
1 1532
今天完成的事情:任务二提交git。spring事务管理。
明天计划的事情:深度思考
遇到的问题:
收获:
Spring事务管理
1. 事务概念
事务一般特指数据库事务,是指作为一个程序执行单元执行的一系列操作,要么完全执行,要么完全不执行
特性:①原子性(atomicity):一个事务是一个不可分割的工作单位
②一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态
③隔离性(isolation):一个事务的执行不能被其他事物干扰
④持久性(durability):一个事务一旦提交,他对数据库中数据的改变应该是永久性的
2.Mysql 事务
1)MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务,外键也是。 MySQL默认以自动提交(autocommit)模式运行。
BEGIN(STARTTRANSACTION) 显式地开启一个事务
COMMIT 提交事务,并使用对数据库进行的所有修改变为永久性的
ROLLBACK 回滚事务,并撤销正在进行的所有未提交的修改
2).事务并发问题
脏读:读取了脏数据,即读取了不合理的、错误的或者本来不存在的数据;
不可重复读:在事务执行的过程中重复读取的同一项数据,但是读取到的结果是不一样的(由于事务B修改对事务A造成了影响)
幻读:由于事务B插入对事务A造成了影响(如事务A将所有商品的库存量改为0,交叉执行的事务B又插入了库存为100的新商品,此时事务A再次查询修改结果发现仍有一个库存量为100的商品)
解决办法:
脏读:读取数据库中永久的数据; 不可重复读:锁行; 幻读:锁表;
mysql事务隔离级别:
-select @@tx_isolation 查询默认隔离级别
-set session transaction isolation level xxx 设置当前会话隔离级别
3. JDBC事务
Connection接口是JDBC进行事务处理的核心,必须是基于一个Connection对象的多个sql操作才能封装成一个事务,不同的Connection对象没办法封装成一个事务; JDBC默认事务处理行为是自动提交;
事务相关方法: setAutoCommit设置自动提交; rollback回滚事务; commit提交事务;
JDBC事务隔离级别
-TRANSACTION_NONE(不支持事务) 0;
-TRANSACTION_READ_UNCOMMITTED(读未提交)1;
-TRANSACTION_READ_COMMITTED(读已提交)2;
-TRANSACTION_REPEATABLE_READ(可重复读)4;
_TRANSACTION_SERIALIZABLE (串行化)8;
事务隔离级别设置 -getTransactionIsolation 获取当前隔离级别 -setTransactionIsolation 设置隔离级别 默认为4
4.Spring 事务处理API
PlatformTransactionManager 事务管理器
TransactionDefinition 事务定义
TransactionSatus 事务状态/正在运行的事务 事务定义传给事务管理器 事务管理器创建出一个正在运行的事务
TransationDefinition接口定义两个内容
隔离级别 -ISOLATION_DEFAULT(使用数据库默认) -ISOLATION_READ_UNCOMMITTED -ISOLATION_READ_COMMITTED -ISOLATION_REPEATABLE_READ -ISOLATION_SERIALIZABLE
默认超时 -TIMEOUT_DEFAULT *默认30秒
事务传播行为,就是当两个方法互相调用时,各自是否有事务,该采取什么方式执行。
评论