事务

事务 Transaction

指一组操作包含多个单一的逻辑,如一个逻辑没成功,则全部失败,数据全部回到最初状态

WHY

为确保逻辑的成功,如银行转账

使用命令行方式演示事务

开启事务:
start transaction;
提交或回滚事务:
commit
rollback

关闭自动提交:
set autocommit=off

使用代码方式演示事务

主要是针对连接(connection)的

1.通过conn.setAutoCommit(false)来关闭自动提交的设置
2.提交事务 conn.commit()
3.加滚事务 conn.rollback()

事务的特性ACID

  • 原子性Automicity

    事务中的逻辑不可分割

  • 一致性Consistency

    事务执行前后数据的完整性

  • 隔离性Isolation

    事务在执行中不应受到其他事务的影响

  • 持久性Durability

    事务执行成功后,数据持久保存到磁盘上

事务的安全隐患

1.读

  • 脏读

    一个事务读到另一个事务还未提交的数据

查看隔离级别
select @@tx_isolation;
设置隔离级别为 读未提交
set session transaction isolatioin level read uncommitted

>read uncommitted		读未提交
read committed 读已提交
repeatable read 可重复读
serializable	可串行化
	一连接设为串行化后,哪个事务先打开,谁就有先执行的权利,其他事务只能等着。特点 是会造成性能的问题
	效率排名:读未提交>读已提交>可重复读>可串行化
  • 不可重复读

    一个事务读到了另一个事务提交的数据,造成前后两次查询结果不一致
    解决了脏读问题,但引发了在事务中两次读取的数据不一致的问题,即不可重复读问题

  • 幻读

    一个事务读到了另一个事务已提交的插入的数据,导致多次查询结果不一致

2.写

  • 丢失更新

  • 悲观锁

    在查询时,加入for update
    select * from account for update(数据库锁机制,排他锁)

  • 乐观锁

    要求程序员自己控制
    在表中加一个字段version,事务提交时比较自己的version与数据库是否一样,不一样则先更新再提交,提交后再将version变更

数据库连接池

开源连接池

DBCP

DataBase Connection Pool 数据库连接池,由Apache开发

jar:
commons-dbcp-.jar
commons-pool-
.jar

1.构建数据源对象
BasicDataSource dataSource = new BasicDataSource();

使用代码方式确定连接的数据库

dataSource.setDriverClassName("");
dataSource.setUrl(“jdbc:mysql://localhost/bank”);// 主协议:子协议://本地/数据库
dataSource.setUsername("");
dataSource.setPassword("");

使用配置文件方式确定连接的数据库

BasicDataSourceFactory factory = new BasicDataSourceFactory();
Properties = properties = new Properties();
InputStream is = new FileInputStream(“src//dbcpconfig.properties”);
DataSource dataSource = factory.createDataSource(properties);

2.得到连接对象
coon = dataSource.getConnection();

C3P0

企业用的较多,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展,使用它的有Hibernate,Spring等

jar:
c3p0-*.jar

1.构建数据源对象
ComboPooledDataSource dataSource = new ComboPooledDataSource();

使用代码方式确定连接的数据库

dataSource.setDriverClassName("");
dataSource.setJdbcUrl(“jdbc:mysql://localhost/bank”);// 主协议:子协议://本地/数据库
dataSource.setUser("");
dataSource.setPassword("");

使用配置文件方式确定连接的数据库

;

配置文件用xml或properties,





2.得到连接对象
coon = dataSource.getConnection();

DBUtils

commons DbUtils是Apache提供的一个对JDBC进行简单封装的开源工具类库

dbutils只是简化了CRUD的代码,连接创建和获取则不在它的范围

QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());

queryRunner.update(sql, params);

queryRunner.query(sql, new ResultSetHandler<>, params);
ResultSetHandler是匿名实现类,实现handle

Account account = queryRunner.query(sql, new BeanHandler(Account.class), params);
BeanHandler是已提供的类
BeanListHandler

ResultSetHandler常用实现 类

BeanHandler 查询到的数据封装成一个对象
BeanListHandler 封装成对象list

ArrayHandler 封装成一个数组
ArrayListHandler 封装成一个数组元素的集合

MapHandler
MaplistHandler

ColumnListHandler
KeyedHandler
ScalarHandler

元数据 Meta data

描述数据的数据

1.数据库元数据
2.参数元数据
3.结果集元数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值