Java-MVC-事务管理

1.【事务的概述】

事务指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。

2.MySql的事务管理:MySql数据库事务管理是自动提交的,Oracle数据库事务默认是不自动提交的。

***2.1手动开启事务

Start transaction; —开启事务
多条sql;
commit、rollback;
***2.2设置一个自动提交参数
show variable like’%commit%’ — 查看与commit相关的参数
set autocommit = 0; –将autocommit参数设置为OFF;

3.JDBC中的事务管理

JDBC的事务管理的API:
- setAutoCommit()
- Commit()
- rollback()

4.转账案例

【步骤一】:创建一个页面
【步骤二】:导入JDBC相关的jar包和工具类
【步骤三】:创建包结构
【步骤四】:提交到Servlet -》 service -》 DAO
【步骤五】:页面跳转。

*两种方式:

在业务层获得Connection通过参数传递给Dao,DBUtils进行事务管理。
在业务层获得Connection,将这个连接板定在当前的 线程中。在DAO中获得连接的话,可以从当前的线程中获取。
ThreadLocal:Hibernate框架。

5.DBUtils实现事务管理

没有事务管理:QueryRunner(Database ds)
Query、update
有事务管理:QueryRunner()
Query、update

6.总结

6.1事务特性:

原子性:强调事务的不可分割
一致性:强调事务的执行的强,数据的完整性要保持一致。
隔离性:一个事务的执行,不应该受到其他事务的干扰。
持久性:事务一旦结束(提交、回滚),数据就持久保持到数据库。

6.2 如果不考事务的隔离性,引发一些安全问题:

一类读问题:
- 脏读:一个事务读到了另一个事务没有提交的数据。
- 不可重复读:一个事务读到了另一个事物已经Update的数据,导致当前的事务中多次查询结果不一致。
- 虚读、幻读:一个事务读到另一个事务一经提交的insert数据,导致在当前的事务中多次查询结果不一致。
一类写问题:
- 引发两类丢失更新;

6.3解决引发的读问题

设置事务的隔离级别:
- Read uncommitted :未提交读,脏读,不可重复读,虚读都可能发生。
- Read committed :已提交读,避免脏读,但是不可重复读和虚读可能发生。
- repeated read:可重复读,避免脏读,不可重复读,但是虚读可能会发生。
- serializable:穿行读,避免脏读,不可重复读,虚读的发生,

MYSQL隔离级别:repeatable read Oracle隔离级别:Read committed
查看mysql的隔离级别: select @@tx_isolation;

7演示脏读的发生:

分别开启两个窗口:A,B
分别查看两个窗口的隔离级别:select @@tx_isolation;
设置A窗口的隔离级别为read uncommitted。****set session transaction isolation level read uncommitted;
分别在两个窗口中开启事务:Start transaction;
在B窗口中完成转账的操作:
update account set money = money + 50 where name = ‘tommy’;
update account set money = money -50 where name = ‘hans’;
在A窗口中进行查询:
A窗口钱已到账。
在B窗口中rollback,钱又返回了。—-A事务读到了B事务还没有提交的数据。

7.1演示避免脏读,不可重复读

分别开启两个窗口:A,B
分别查看两个窗口的隔离级别:select @@tx_isolation;
设置A窗口的隔离级别为read uncommitted。****set session transaction isolation level read committed;
分别在两个窗口中开始事务:
Start transaction
在B窗口中完成转账的操作:
update account set money = money + 50 where name = ‘tommy’;
update account set money = money -50 where name = ‘hans’;
在A创建口中进行查询:—- 避免了脏读;
在B窗口中提交了事务;
commit();
在A窗口在次查询:—转账成功(不可重复读:一个事务读到另一个事务中已经提交的update的数据,导致多次查询结果不一致)

7.2演示避免不可重复读:

分别开启两个窗口:A,B
分别查看两个窗口的隔离级别:select @@tx_isolation;
设置A窗口的隔离级别为read uncommitted。****set session transaction isolation level repeatable read;
分别在两个窗口中开启事务。
update account set money = money + 50 where name = ‘tommy’;
update account set money = money -50 where name = ‘hans’;
在A窗口中进行查询:—转账没有成功
在B窗口提交事务:
在A窗口中在次查询:—没有变化,转账没有成功:避免了不可重复读。
在A窗口中commit;
在A窗口中再次查询。

7.3避免虚读:

分别开启两个窗口:A,B
分别查看两个窗口的隔离级别:select @@tx_isolation;
设置A窗口的隔离级别为read uncommitted。****set session transaction isolation level serializable;
在A,B两个窗口中分别开启事务
在B窗口中完成insert操作:
insert into account(id,name,money) values(7,’shally’,5000);
在A创建中进行查询的操作
A卡住,等待状态; — 没查到任何结果,等待B提交。
在B中提交,A中就显示出来了。
串行,必须的等一个事务成功后,在进行下一步。

总结

EE开发的三层结构:

客户端层 :Java Applet、HTML、CSS、JS
WEB层 :Servlet + JSP
业务层 : EJB
持久层 : Dao
EE开发中的经典的三层结构:
WEB:Servlet JSP — Struts2、SpringMVC、Struts1,WebWork
JavaBean — Spring
JDBC —- MyBatis 、Hibernate、DBUtils、JDBCTemplate
使用Servlet + JSP + JavaBean + JDBC 开发。

EE的三层架构和MVC是不同的时候由不同的人、组织提出的开发方案。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值