Best way to prevent post duplication when using multiple loops

You can gather the post id(s) from the first loop in an array and then use post__not_in arg in the second loop.

$exclude = array();
if ( have_posts() ) : while ( have_posts() ) : the_post();
//first loop
$exclude[] = get_the_ID();
...


//second loop
$second_loop_args = array(
    'showposts' => 3,
    'post_type' => 'post',
    'category_name' => 'Personal', //should make sure you're using category slug here
    'post__not_in' => $exclude //this arg needs to be an array, hence moving from string to array format for query_post args
);
query_posts($second_loop_args);
....

**I will say though, that you should reconsider using new WP_Query() for your loops instead of query_posts as detailed here: https://codex.wordpress.org/Class_Reference/WP_Query

It’s basicaly the same, but instead of using query_posts, you just assign a variable your new WP_Query class and loop through it.