mysql事务

事务

MySQL:每一条语句都属于独立事务,默认自动管理提交的。

如果需要把多条语句当成一个整体,那么就需要把多条语句放在一个事务里面

开启事务:start transaction

提交事务:commit;

回滚事务:rollback

JDBC控制事务语句

Connection.setAutoCommit(false);   //start transaction

Connection.rollback(); // rollback

Connection.commit(); // commit

事务的特点

事务的特性:ACID

原子性( Atomicity )[ˌætəˈmɪsəti]、一致性( Consistency )[kənˈsɪstənsi]、隔离性( Isolation )[ˌaɪsəˈleɪʃn]和持久性( Durability )[dərəˈbɪlɪti]

原子性:事务是数据库的逻辑工作单位,事务中包含的各操作要么都完成,要么都不完成

一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

隔离性:一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性:指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。 

事务的隔离级别:

属于事务的。都已开启了事务为前提。

不考虑事务的隔离级别,会出现以下的情况

  1. 脏读:一个线程中的事务读到了另外一个线程中未提交的数据。
  2. 不可重复读:一个线程中的事务读到了另外一个线程中已经提交的update的数据。
  3. 虚读:一个线程中的事务读到了另外一个线程中已经提交的insert的数据。

要想避免以上现象,通过更改事务的隔离级别来避免:

  1. READ UNCOMMITTED 脏读、不可重复读、虚读有可能发生。
  2. READ COMMITTED 避免脏读的发生,不可重复读、虚读有可能发生。
  3. REPEATABLE READ 避免脏读、不可重复读的发生,虚读有可能发生。
  4. SERIALIZABLE 避免脏读、不可重复读、虚读的发生。

设置当前会话事务隔离级别

set transaction isolation level REPEATABLE READ;

级别依次升高,效率依次降低。

MySQL:默认REPEATABLE READ

ORACLE:默认READ COMMITTED

MySQL:

SELECT @@SESSION.transaction_isolation;//查看当前的隔离级别

set transaction isolation level  级别;// 设置当前的事务隔离级别

练习:read uncommitted;

cmd开启两个窗口,分别进去mysql

输入 mysql -u 用户名 -p   然后回车

输入密码 然后回车

T1表示窗口一输入的内容,T2表示窗口二输入的内容

按照从上往下的顺序执行表格中的sql,可以看到脏读和不可重复读,虚读/幻读的情况

时间

T1

T2

说明

t1

start transaction

t2

select * from account where id=1;

1000

t3

start transaction

t4

update account set balance=balance+100 where id=1;

t5

select * from account where id=1;

1100

读到了另外一个线程中未提交的数据:脏读

t6

commit;

t7

select * from account where id=1;

1100

读到了另外一个线程中提交的update数据:不可重复读

t8

select count(*) from account;

2

t9

insert into account values(3,'wangwu',1000);

t10

select count(*) from account;

3

读到了另外一个线程中提交的insert数据:虚读(幻读)

t11

commit;

JDBC设置隔离级别

Connection对象,在开启事务之前进行设置

批处理 --- 批量处理sql语句

在jdbc的url中添加rewriteBatchedStatements=true参数,可以提高批处理执行效率。

在我们进行大批量数据操作的时候,需要采用批处理的方式来提高程序的运行性能,目的是减少跟数据库交互的次数

  1. 批量执行多条sql语句,sql语句不相同(statement.addBatch(inserSql))
  2. 批量插入100条记录,sql语句相同,只是参数值不同(statement.addBatch();)
  3. 批量插入10000条记录,需要分批次提交()

JDBC操作大数据

批处理 + 事务

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓风L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值