SQL注入问题及事务
Posted Java大数据资源社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入问题及事务相关的知识,希望对你有一定的参考价值。
在这里我给大家数一下数据库中的常见问题,有时候我们在测试数据的时候会发现当我们在文本框中输入sql代码时数据库接收数据则会收到影响,这就是我们常说的sql注入问题,在这里我们常用的解决方案就是使用PrepareStatement对象替代Statement对象接收页面数据,下面我在这里给大家详细的说一下。
用户名输入: tom'--即可将sql语句改变为
SELECT * FROM users NAME = 'tom' AND PASSWORD ='1234';
SELECT * FROM users NAME ='tom' --'AND PASSWORD = '1234';
后方的密码部分将会被备注不起作用,此问题称为sql的注入问题
本质原因是让用户参与到了sql语句的编写中。
statement的对象功能比较单一,仅仅将sql语句运输到数据库执行
**PrepareStatement比较勤快
PerpareStatement会先进行一次sql语句的运输,例如
SELECT * FROM users NAME = ? AND PASSWORD =?;
此语句先进行编译,并无法执行,当PerpareStatement第二次将用户的提交的数据传递过来即可运行
当我们在实际操作时也会遇到这么一个问题,例如我们遇到转账操作时,此时我们需要扣一个人的账户加到另一个账户中去,如果出现了意外情况,此时如果只操作了一条sql语句,就会对一方造成损失,因此我们需要保证两条sql语句有一条执行则必须执行另一条,否则两条都不执行。这里我们需要了解一个新的东西,就是事务,以下是我对事务的理解及详细介绍。
建表语句
CREATE TABLE t_account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
balance DOUBLE(6,2)
)
-- tom向jerry转账100元的事务
-- 开启事务
START TRANSACTION;
-- 在tom的账户扣除100元
UPDATE t_account SET balance = balance-100 WHERE id=1;
-- 在jerry的账户添加100元
UPDATE t_account SET balance = balance+100 WHERE id=2;
-- 如果成功则提交事务
COMMIT;
-- 如果失败则回滚事务
ROLLBACK;
执行结果显示
[SQL] START TRANSACTION;
受影响的行: 0
时间: 0.000ms
[SQL]
UPDATE t_account SET balance = balance-100 WHERE id=1;
受影响的行: 1
时间: 0.001ms
[SQL]
UPDATE t_account SET balance = balance+100 WHERE id=2;
受影响的行: 1
时间: 0.001ms
[SQL]
COMMIT;
受影响的行: 0
时间: 0.069ms
[SQL]
ROLLBACK;
受影响的行: 0
时间: 0.000ms
在mysql中默认所有的sql语句都在事务中执行,不开启事务的话两条语句会产生两个事务,
当语句执行完成并没有问题的时候,事务会自动提交。
****开启事务则只产生一个事务,通过 start transaction来开启事务,手动控制每条sql语句执
行完成都不会自动提交
****事务的结束
1.commit 提交:语句执行成功则提交
2.rollback 回滚:语句执行失败则回滚事务
3.断网,宕机。。相当于自动回滚
4.超时。。自动回滚
5.DDL事务会自动提交
——详解DDL、DCL、DML
DDL(数据定义语言)
CREATE DROP ALTER TRANSACTION
DCL(数据控制语言)
GRANK COMMIT RLLBACK
DML (数据操作语言)
INSERT UPDATE DELETE
|-DQL(DQL分属于DML)SELECT
以上是关于SQL注入问题及事务的主要内容,如果未能解决你的问题,请参考以下文章